我有一个简单的html表单,在这里我可以添加一些数据并将其提交到db中
表格如下:
<!-- MAIN CONTENT-->
<div class="main-content">
<div class="section__content section__content--w1830">
<div class="container-fluid">
<h1>Artikel</h1>
<br>
<br>
<div class="card">
<div class="card-header">Artikel hinzufügen</div>
<div class="card-body">
<form action="" method="post">
{% csrf_token %}
<div class="form-group">
<div class="row form-group">
<div class="col-4">
<label for="type" class="control-label mb-1">Typ</label>
<select name="type" id="type" class="form-control"
value=" {{ forms.artikel_typ }} ">
<option value="0">Bitte auswählen</option>
<option value="1">Raum</option>
<option value="2">Artikel</option>
<option value="3">Gerät</option>
<option value="4">Marketing</option>
<option value="5">Labor</option>
</select>
</div>
<div class="col-8">
<label for="bezeichnung" class="control-label mb-1"> Bezeichnung</label>
<input id="bezeichnung" name="bezeichnung" type="text" class="form-control"
data-val="true"
data-val-required="Bitte tragen Sie eine Bezeichnung ein!"
aria-required="true" aria-invalid="false"
placeholder="Bitte tragen Sie eine Bezeichnung ein." value ="{{ forms.bezeichnung }}">
</div>
</div>
</div>
<div class="card-body card-block">
<div class="row form-group">
<div class="col-4">
<label for="menge" class="control-label mb-1">Menge</label>
<input id="menge" type="number"
class="form-control" data-val="ture"
data-val-required="Bitte tragen Sie die Menge ein!"
aria-required="true" aria-invalid="false"
placeholder="Bitte geben Sie die Menge an." value=" {{ forms.menge }} ">
</div>
<div class="col-4">
<label for="einheit" class="control-label mb-1">Einheit</label>
<select name="einheit" value="{{ forms.einheit }}" id="einheit"
class="form-control"
data-val-required="Bitte tragen Sie die Einheit ein!"
aria-required="true" aria-invalid="false">
<option value="0">Bitte auswählen</option>
<option value="Euro">Euro</option>
<option value="Prozent">Prozent</option>
<option value="Minuten">Minuten</option>
<option value="Stück">Stück</option>
<option value="pauschal">pauschal</option>
</select>
</div>
<div class="col-4">
<label for="preis">Preis</label>
<input id="preis" value="{{ forms.preis }}" step="0.01" type="number"
class="form-control"
data-val="ture"
data-val-required="Bitte tragen Sie den Preis ein!"
aria-required="true" aria-invalid="false"
placeholder="Bitte tragen Sie den Preis ein!">
</div>
</div>
</div>
<div class="card-footer">
<button type="submit" class="btn btn-primary btn-sm" value="post" action="articles">
<i class="fa fa-dot-circle-o"></i> Artikel hinzufügen
</button>
</div>
</div>
</form>
</div>
<div class="container-fluid">
<div class="row">
<div class="col-lg-9">
<div class="table-responsive table--no-card m-b-30">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>id</th>
<th>artikel_typ</th>
<th>bezeichnung</th>
<th>menge</th>
<th>preis</th>
<th>einheit</th>
</tr>
</thead>
<tbody>
{% for d in data %}
<tr>
<td>{{ d.id }}</td>
{% if d.artikel_typ == 1 %}
<td> Raum</td>
{% endif %}
{% if d.artikel_typ == 2 %}
<td> Artikel</td>
{% endif %}
{% if d.artikel_typ == 3 %}
<td> Gerät</td>
{% endif %}
{% if d.artikel_typ == 4 %}
<td> Marketing</td>
{% endif %}
{% if d.artikel_typ == 5 %}
<td> Labor</td>
{% endif %}
<td>{{ d.bezeichnung }}</td>
<td>{{ d.menge }}</td>
<td>{{ d.preis }}</td>
<td>{{ d.einheit }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- END PAGE CONTAINER-->
这是正在使用的代码的views.py部分:
def articles(request):
data = Artikel.objects.all()
aform = ArtikelForm( data=request.POST or None)
if request.method == "POST":
if aform.is_valid():
artikel_type = aform.cleaned_data['artikel_typ']
bezeichnung = aform.cleaned_data['bezeichnung']
menge = aform.cleaned_data['menge']
preis = aform.cleaned_data['preis']
einheit = aform.cleaned_data['einheit']
artikel = Artikel(artikel_typ=artikel_type, bezeichnung=bezeichnung, menge=menge, preis=preis, einheit=einheit)
artikel.save()
return redirect("articles")
return render(request, "articles.html", {"data": data, "forms": aform})
这是我定义的forms.py:
from django import forms
课堂艺术形式(forms.Form):
artikel_typ = forms.IntegerField()
bezeichnung = forms.CharField(max_length=100)
menge = forms.FloatField()
preis = forms.FloatField()
einheit = forms.CharField(max_length=100)
这是models.py中定义的模型:
class Artikel(models.Model):
id = models.AutoField(unique=True, primary_key=True)
artikel_typ = models.IntegerField(null=True)
bezeichnung = models.TextField()
menge = models.FloatField(blank=True, null=True)
preis = models.FloatField(blank=True, null=True)
einheit = models.TextField(blank=True, null=True)
因此,我在python控制台中尝试了模型、表单和。我将数据添加到dict中,创建了ArtikelForm的一个实例并调用is_valid(),它返回true,清理后的_数据看起来不错
但是,在提交表单时,is_valid()返回falls,整型字段和浮点字段的字段值返回None,检索char字段并显示我输入/选择的信息,HTTP响应为200并被重定向。有人知道我该如何解决这个问题吗?谢谢
这里有一些问题,我会详细解释。无论何时在Django中创建表单,都必须为其创建一个类,该类定义所有字段,以及如何“构建”表单,这是您在
forms.py
中正确完成的。即使您正确地做到了这一点,您也可能希望研究从forms.ModelForm
继承,因为它将使表单创建更容易。基本上ModelForm
会自动为给定的Model
生成一个表单。看here 更多信息真正神奇的地方是
views.py
,在那里处理请求并返回具有适当格式的呈现html。您所做的是查询模型中的某些对象data = Artikel.objects.all()
,然后创建表单aform = ArtikelForm( data=request.POST or None)
,然后检查该方法是否为POST
请求,以便验证表单并执行其他操作。但是,在底部,当您返回时,您并没有将表单传递给html。您需要确保传递包含所有内容的词典,例如return render(request, 'articles.html', {'data': data, 'forms': aform})
。这将解决无法从模板访问表单的问题。但这意味着您将以如下形式访问特定字段:{{ forms.artikel_typ }}
我还想指出,在
views.py
中,要访问表单中的数据以保存到模型,通常需要获取“清理的数据”。Django这样做是为了确保所有字段都变成某种python标准,以便轻松使用它并将其保存到模型中。访问它的方法是执行aform.cleaned_data['artikel_typ']
。也可以考虑使用crispy forms,这样就不必手动生成表单编辑
在html模板中,您所需要做的就是访问
{{ forms.field_name }}
,它将放入该字段小部件的html中。不需要手动创建表单,这就是使用Django表单的原因。见下文:如果您想重新排列每个字段的位置并进行一些样式设置,则可以单独访问每个字段,但您也可以简单地使用
{{ forms }}
,这将呈现所有字段相关问题 更多 >
编程相关推荐