Django POST是_valid()false,没有错误,也没有写入数据库

2024-09-29 21:53:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的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并被重定向。有人知道我该如何解决这个问题吗?谢谢


Tags: divdatavalueformslabelclasstdoption
1条回答
网友
1楼 · 发布于 2024-09-29 21:53:11

这里有一些问题,我会详细解释。无论何时在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表单的原因。见下文:

 <!  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 %}
                            {{ forms.artikel_typ }}
                            {{ forms.bezeichnung }}
                            {{ forms.menge }}
                            {{ forms.preis }}
                            {{ forms.einheit }}
                    </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 >

如果您想重新排列每个字段的位置并进行一些样式设置,则可以单独访问每个字段,但您也可以简单地使用{{ forms }},这将呈现所有字段

相关问题 更多 >

    热门问题