python - 在 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">
解决方案
问题是使用 <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 中的字段不匹配
推荐阅读
- entity-framework - EdmGen 不支持 .Net Framework 4.7.2 版
- c# - 如何获取SSRS中开始日期和结束日期之间差异的平均值
- elasticsearch - 在 Elasticsearch 中推广结果
- java - 了解第三方库的测试和编译依赖
- internet-explorer - 如何在 IE 浏览器的 mat-datepicker 中修复两位数的年份?
- javascript - 硒承诺{
} 同时期望返回一个字符串 - java - 包含自动装配依赖项的 Mockbean
- mysql - 具有未索引的列条件的Mysql大型数据集查询
- c - 减少 C 函数中的参数数量
- c# - c# 自定义异常