【问题标题】:Django - Form data won't save to the databaseDjango - 表单数据不会保存到数据库
【发布时间】:2019-01-22 16:46:42
【问题描述】:

我创建了一个“香草”表单,提交时应根据文本输入检查项目是否存在。如果它确实会增加该项目“item_selected”字段上的计数器,然后继续使用该项目和提交的其余字段创建申请记录。否则该项目不存在,它将创建项目记录以及创建申请记录。提交我的表单时,什么都没有发生。我确保 url 路由是正确的并且被提交到正确的视图。

我不相信我可以使用 ModelForm,因为 ModelForms 绑定到一个模型,而我在这里尝试更新多个表。提前谢谢!

Views.py

def create_req(request):
    if request == 'POST':
        req_form = ReqForm(request.POST)
        if req_form.is_valid():
            try:
                item_record = ItemMaster.objects.get(item=req_form.cleaned_data['item'])
                item_record.save(commit=False)
                item_record.item_selected = F('item_selected') + 1
                item_record.save()

                requisition_record = Requisition.objects.create(item=req_form.cleaned_data['item'], 
                                                                signature=req_form.cleaned_data['signiture'])
                requisition_record.save(commit=False)
                requisition_record.username = CustomUser.objects.get(username=request.user)
                requisition_record.save()
            except ItemMaster.DoesNotExit:
                item_record = ItemMaster.objects.create(item=req_form.cleaned_data['item'], 
                                                        description=req_form.cleaned_data['description'], 
                                                        price=req_form.cleaned_data['price'], 
                                                        item_selected=1)
                item_record.save()

                requisition_record = Requisition.objects.create(item=req_form.cleaned_data['item'], signature=req_form.cleaned_data['signiture'])
                requisition_record.save(commit=False)
                requisition_record.username = request.user
                requisition_record.save()
            return HttpResponseRedirect(reverse('home') )
    else:
        req_form = ReqForm()
    return render(request, 'req/create_req.html', {'req_form':req_form})

forms.py

class ReqForm(forms.Form):
    item = forms.CharField(min_length=3, max_length=20)
    description = forms.CharField(min_length=0, max_length=50, empty_value='' )
    price = forms.DecimalField(max_digits=19, decimal_places=2)
    signiture = forms.CharField(min_length=0, max_length=10, empty_value='')

create_req.html

<p>
    <a href="{% url 'home' %}">Home</a> &nbsp
    <a href="{% url 'requisition:create_req' %}">Reset Form</a>
</p>

<h1>Example Form</h1>
{% if error_message %}
<p>
    <strong>{{error_message}}</strong>
</p>
{% endif %}

<body>  
    <form method="post" action="{% url 'requisition:create_req' %}" >
      {% csrf_token %}
      {{ req_form }}
      <input type="submit" value="Submit">
    </form>
</body>

Urls.py

app_name = 'requisition'
urlpatterns = [
    path('', views.create_req, name='create_req'),
]

【问题讨论】:

    标签: django django-models django-forms django-templates django-views


    【解决方案1】:

    改变

    if request == "POST":
        ...
    

    if request.method == "POST":
        ...
    

    【讨论】:

    • 成功了,谢谢!但是对于未来,我是不是总是要放 request.method 呢?我还是 django 的新手。
    • 是的,或者您可以执行类似 form = ReqForm(request.POST or None) 的操作,其中 ReqForm 是您的表单名称
    • 哪种方式更好,还是纯粹基于意见?
    • 使用前者更传统,因为它更明确
    • 非常感谢!你帮了很多忙!
    猜你喜欢
    • 2020-08-29
    • 2012-07-16
    • 2021-10-07
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2021-08-13
    • 2016-10-15
    相关资源
    最近更新 更多