首页 > 解决方案 > Django 使用表格中选定行的数据预先填写表格

问题描述

这个网站有很大的帮助,但现在我被困住了。我有一个页面(allrmview),用户可以在其中过滤表格。完成后,他可以选择一条线。它会打开一个表单 (NewrmForm) 页面,该页面预先填充了表格中所选行的一些信息。我不明白如何将选择的数据发送到新表单。由于我是初学者,因此缺少很多元素。

模型.py:

class Infomp(models.Model):
    url = models.CharField(unique=True, max_length=150, blank=True, null=True)
    name = models.CharField(max_length=37, blank=True, null=True)
    synonyme = models.CharField(max_length=126, blank=True, null=True)
    chemname = models.CharField(max_length=100, blank=True, null=True)
    cas = models.CharField(max_length=15, blank=True, null=True)
    einecs = models.CharField(max_length=15, blank=True, null=True)
    mweight = models.FloatField(blank=True, null=True)
    vappress = models.CharField(max_length=31, blank=True, null=True)
    solublein = models.CharField(max_length=89, blank=True, null=True)
    insoluble = models.CharField(max_length=12, blank=True, null=True)
    odortype = models.CharField(max_length=11, blank=True, null=True)
    odorstrength = models.CharField(max_length=55, blank=True, null=True)
    substantivity = models.CharField(max_length=44, blank=True, null=True)
    odordescript1 = models.CharField(max_length=100, blank=True, null=True)
    odordescript2 = models.CharField(max_length=100, blank=True, null=True)
    usagelevel = models.CharField(max_length=39, blank=True, null=True)
    ifra = models.CharField(max_length=24, blank=True, null=True)
    risk = models.CharField(max_length=20, blank=True, null=True)
    cosing = models.CharField(max_length=6, blank=True, null=True)

class RmStock(models.Model):
    id = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
    num = models.IntegerField(unique=True)
    n_tgsc = models.SmallIntegerField(blank=True, null=True)
    nom_mp = models.CharField(max_length=60)
    quantite = models.FloatField(blank=True, null=True)
    fournisseur = models.IntegerField(blank=True, null=True)
    cert_ifra = models.TextField(blank=True, null=True)
    tds = models.TextField(blank=True, null=True)
    msds = models.TextField(blank=True, null=True)
    od_strength = models.CharField(max_length=30, blank=True, null=True)
    od_type = models.CharField(max_length=30, blank=True, null=True)
    od_descr = models.CharField(max_length=255, blank=True, null=True)
    n_cas = models.CharField(max_length=30, blank=True, null=True)
    subst = models.CharField(max_length=10, blank=True, null=True)
    kindofm = models.SmallIntegerField(blank=False, default='4')
    n_mp = models.SmallIntegerField()
    r_fourn = models.CharField(max_length=10, blank=True, null=True)

表格.py:

from django import forms
from .models import RmStock

class NewrmForm(forms.ModelForm):
    class Meta:
        model = RmStock
        fields = [
            'nom_mp',
            'n_cas',
            'fournisseur',
            'num'
            ]

我想我必须在 addnew-view 中使变量对应。但是很热,有些字段对应于上表中的字段。更明确地说,我怎样才能写出
nom_mp = infomp.name
n_cas=infomp.cas

视图.py:

def allmaterial_search_view(request):
    rms = Infomp.objects.all()
    name_synonyme_chemname_query = request.GET.get('name_synonyme_chemname')

    if name_synonyme_chemname_query !='' and name_synonyme_chemname_query is not None:
        rms = rms.filter (Q(name__icontains=name_synonyme_chemname_query) | Q(synonyme__icontains=name_synonyme_chemname_query)).distinct()
    context = {
        'queryset': rms
    }
    return render(request,'rawmaterials/allrmview.html', context)

def addnewrm_view(request):
    form = NewrmForm(request.POST or None)
    if form.is_valid():
        form.save()

    context = {'form':form}
    return render(request,'rawmaterials/addnewrm.html', context)

在这里的表格上发一个帖子可能是这样,但我猜不是这样写的。

allrmview.html

{% extends "app/layout.html" %}

{% block content %}
<form>
<div class="container">
    <input class="" type="search" name="name_synonyme_chemname" placeholder="Enter name" value="">
    <button type="submit" class="btn btn-primary">Search</button>
</div>
</form>
<div class="row">
    <div class="col-md" style="margin-left:5%;margin-right:5%";>
        <div class="card card-body">
            <h5>All Raw Materials</h5>
        </div>
        <div class="card card-body">
            <table class="table">
                <tr>
                    <th>Nom</th>
                    <th>Synonyme</th>
                    <th>CAS</th>
                </tr>
               
                {% for infomp in queryset %}
                <tr>
                    <form action='/add_rm_to_myrm/'' method="post" id="addrmForm">
                        {% csrf_token %}
                    <td>{{infomp.name}}</td>
                    <td>{{infomp.synonyme}}</td>
                    <td>{{infomp.cas}}</td>
                    <td>{{infomp.pk}}</td>
                    
                    <td>
                        <button type="submit" name="addrm_b" value="try" class="btn btn-primary">+</button>
                        <a class="btn btn-primary" target="_blank" href="/rawmaterials">+</a>
                        </form>
                    </td>
                </tr>
                {% endfor %}
            
            </table>
        </div>
    </div>
</div>

{% endblock %}

addnewrm.html

{% extends "app/layout.html" %}

{% block content %}
<div class="container">
    <form>{{ form.as_p }}
        <button type="submit" class="btn btn-primary">validate</button>    
    </form>
</div>

{% endblock %}

网址.py

 path('allrmview/', allmaterial_search_view),
    path('add_rm_to_myrm/', addnewrm_view)

我希望我已经足够清楚了,很抱歉成为菜鸟,但我必须从某个地方开始。也许初始或实例是解决方案,但我不知道如何放置。

编辑所以它变得好多了,但仍然停留在一件小事上。

这段代码不起作用:

form = NewrmForm(request.POST or None,initial=initial_dict)

我试过这个但不是更好:

form = NewrmForm(initial=initial_dict)
if request.method == 'POST':
        form = NewrmForm(request.POST or None)

如果我没有用首字母代替请求,则表格已预先填写,但当然它不会将表格发送到数据库。就像写的一样,它的工作原理是这些字段没有预先填写。有什么线索吗?这是整个代码:

视图.py

def allmaterial_search_view(request):
    rms = Infomp.objects.all()
    name_synonyme_chemname_query = request.GET.get('name_synonyme_chemname')

    if name_synonyme_chemname_query !='' and name_synonyme_chemname_query is not None:
        rms = rms.filter (Q(name__icontains=name_synonyme_chemname_query) | Q(synonyme__icontains=name_synonyme_chemname_query)).distinct()
    context = {
        'queryset': rms
    }
    return render(request,'rawmaterials/allrmview.html', context)

def addnewrm_view(request, id):
    infomp=Infomp.objects.get(id=id)
    lastnum = RmStock.objects.all().order_by('num').last().num
    lastnum1 = lastnum+1
    initial_dict = {'nom_mp': infomp.name, 'num':lastnum1}
    if request.method == 'POST':
        form = NewrmForm(request.POST or None,initial=initial_dict)
        if form.is_valid():
            form.save()  
            return redirect("/")  
    else:  
        form = NewrmForm()
  
    context = {'form':form,
                'infomp':infomp
         }    
    return render(request,'rawmaterials/addnewrm.html', context)

allrmview.py:

{% extends "app/layout.html" %}

{% block content %}
<form>
<div class="container">
    <input class="" type="search" name="name_synonyme_chemname" placeholder="Enter name" value="">
    <button type="submit" class="btn btn-primary">Search</button>
</div>
</form>
<div class="row">
    <div class="col-md" style="margin-left:5%;margin-right:5%";>
        <div class="card card-body">
            <h5>All Raw Materials</h5>
        </div>
        <div class="card card-body">
            <table class="table">
                <tr>
                    <th>Nom</th>
                    <th>Synonyme</th>
                    <th>CAS</th>
                </tr>
               
                {% for infomp in queryset %}
                <tr>
                    <form action='/add_rm_to_myrm/{{ infomp.id }}' method="post" id="addrmForm">
                        {% csrf_token %}
                    <td>{{infomp.name}}</td>
                    <td>{{infomp.synonyme}}</td>
                    <td>{{infomp.cas}}</td>
                    
                    <td>
                        <button type="submit" name="addrm_b" value="try" class="btn btn-primary">+</button>
                        <a class="btn btn-primary" target="_blank" href="/add_rm_to_myrm/{{ infomp.id }}">+</a>
                        </form>
                    </td>
                </tr>
                {% endfor %}
            
            </table>
        </div>
    </div>
</div>

{% endblock %}

<input class="" type="search" name="name_synonyme_chemname" placeholder="Enter name" value="">

添加newrm.py

{% extends "app/layout.html" %}


{% block content %}
<div class="container">
    <form method="POST" >
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="btn btn-primary">validate</button>    
    </form>
</div>

{% endblock %}

标签: pythondjangoforms

解决方案


推荐阅读