python - 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 %}
解决方案
推荐阅读
- c# - 发布包含 jpg 和 json 的多部分请求会导致内部服务器错误和 IIS 上的 win32 状态 64
- python - 用 Selenium 抓取 Amazon - XPath 问题
- assembly - 解释师算子组装
- python - 无法从输入字段中获取整数值
- html - 当特定字符串存在部分工作时突出显示 HTML 正文?
- python - 将 Entry Tkinter 框保存到文本文件
- javascript - 我的应用不想重新渲染,但是上下文中的列表确实
- reactjs - 即使验证模式报告错误,Formik 的“isValid”也报告为真
- c++ - MS Visual Studio 2015。“构建解决方案”失败。但是“对解决方案运行代码分析”有效。?
- javascript - JavaScript (ReactJS) 比较两个对象