首页 > 解决方案 > 在 django 中使用 ModelForm 在 Crispy 表单中保存数据有困难

问题描述

在由 {{ form|crispy}} 呈现的表单上保存 django 中的数据可以正常工作,但是当我使用 {{ form.ShowStatus|as_crispy_field}} 呈现模板时,什么都没有保存。

数据最初加载到表单中没有问题,这是一个更新问题。我错过了什么吗?Django==3.0,django-crispy-forms==1.9.2,Bootstrap 版本 4.3.1,Python 3.8.5

我错过了什么吗?

这有效....将现有数据加载到 Show_form.html

{% extends "fungi/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
    <div class="content-section">
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">New Filter</legend>
                {{ form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-primary" type="submit">Create filter</button>
            </div>
        </form>
    </div>loads
{% endblock content %}

工作代码的回溯

[24/Mar/2021 19:57:01] "GET /testform/show/3/ HTTP/1.1" 200 5065
[24/Mar/2021 19:57:06] "GET /testform/show/3/update/ HTTP/1.1" 200 11845
[24/Mar/2021 19:57:14] "POST /testform/show/3/update/ HTTP/1.1" 302 0
[24/Mar/2021 19:57:14] "GET /testform/show/3/ HTTP/1.1" 200 5062

用上面的代码呈现形式

这不起作用....加载现有数据但单击提交按钮时不保存

Show_form.html

{% extends "fungi/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
    <div class="content-section">
        <form method="POST">
            {% csrf_token %}
            <div class="form-row">
                <div class="form-group col-md-4 mb-0">
                    {{ form.ShowAll|as_crispy_field }}
                </div>
                <div class="form-group col-md-4 mb-0">
                    {{ form.ShowFungi|as_crispy_field}}
                </div>
                <div class="form-group col-md-4 mb-0">
                    {{ form.ShowHabitat|as_crispy_field}}
                </div>
                <div class="form-group col-md-4 mb-0">
                    {{ form.ShowStatus|as_crispy_field }}
                </div>
                <div class="form-group col-md-4 mb-0">
                    {{ form.ShowStipe|as_crispy_field}}
                </div>
                <div class="form-group col-md-4 mb-0">
                    {{ form.ShowCap|as_crispy_field}}
                </div>
            </div>
        </div>    
        <div class="form-group">
            <button class="btn btn-outline-info" type="submit">Save filter</button>
        </div>
        </form>
    </div>
{% endblock content %}

非工作代码的回溯

[24/Mar/2021 20:01:00] "GET /testform/filterhome/ HTTP/1.1" 200 4543
[24/Mar/2021 20:01:01] "GET /testform/show/3/ HTTP/1.1" 200 5062
[24/Mar/2021 20:01:03] "GET /testform/show/3/update/ HTTP/1.1" 200 17033
[24/Mar/2021 20:01:08] "POST /testform/show/3/update/ HTTP/1.1" 200 17033

用上面的代码呈现形式

视图.py

class EditFilter(UpdateView):
    model = Show
    fields = '__all__' 
    def form_valid(self, form):
        form.instance.user = self.request.user
        return super().form_valid(form)

模型.py

class Show(models.Model):
    FilterChoice = models.TextChoices('FilterChoice','show, hide,unknown')
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    ShowAll = models.CharField(max_length=8,blank=True,null=True, default='unknown', choices=FilterChoice.choices)
    ShowFungi = models.CharField(max_length=8,blank=True,null=True, default='unknown', choices=FilterChoice.choices)
    ShowHabitat = models.CharField(max_length=8,blank=True,null=True, default='unknown', choices=FilterChoice.choices)
    ShowCap = models.CharField(max_length=8,blank=True,null=True, default='unknown', choices=FilterChoice.choices)
    ShowStipe = models.CharField(max_length=8,blank=True,null=True, default='unknown', choices=FilterChoice.choices)
    ShowStatus = models.CharField(max_length=8,blank=True,null=True, default='unknown', choices=FilterChoice.choices)

    class Meta:
        managed = True
        db_table = 'Show'

    def __str__(self):
        return f'{self.user.username}:'+' User ID: ' +str(self.user.id)+', Habitat:'+self.ShowHabitat

    def get_absolute_url(self):
        return  reverse('testform:view-filters', kwargs={'pk': self.pk})

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

引导版本 4.3.1

   <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">

标签: pythondjangoforms

解决方案


问题是使用 <fields = ' all ' 在 DetailView 中包含用户字段。

原来的

class FilterView(DetailView):
    model = Show
    #fields = '__all__' implied  

将其更改为:

class FilterView(DetailView):
    model = Show
    exclude = ['user'] 

由于不能使用 exclude =[' field '] 我添加了所有需要更新的字段

class EditFilter(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Show
    #fields = '__all__' 
    fields = [
    'ShowAll',
    'ShowFungi', 
    'ShowHabitat', 
    'ShowCuisine', 
    'ShowCap', 
    'ShowStipe', 
    'ShowStatus', 
    ] 

它不适用于现在的问题。问题的症结在于模板中渲染的 as_crispy_field(s) 与 DetailView 中的字段不匹配


推荐阅读