我正在尝试使用Django脆皮表格进行格式化,但无法保存。
第一个代码:
forms.py
class CreateForm_test(forms.Form):
name = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Name'}))
street = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Street'}))
number = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Number'}))
comment = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Comment'}))
phone = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Phone'}))
status = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Status'}))
class CrispyAddressForm(CreateForm_test):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.layout = Layout(
Row(
Column('name', css_class='form-group col-md-6 mb-0'),
css_class='form-row'
),
'street',
'number',
Row(
Column('comment', css_class='form-group col-md-6 mb-0'),
Column('phone', css_class='form-group col-md-2 mb-0'),
Column('status', css_class='form-group col-md-2 mb-0'),
css_class='form-row'
),
Submit('submit', 'Submit')
)
views.py
class CreateRegisterView(CreateView):
model = Register
message = _("saved")
form_class = CrispyAddressForm
template_name = 'register_form.html'
def form_valid(self, form):
if self.request.user.is_authenticated:
form.instance.user = self.request.user
return super().form_valid(form)
def get_success_url(self):
messages.success(self.request, self.message)
return reverse('home')
register_form.html
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
{% crispy form %}
{% endblock %}
当我在浏览器中打开表单时,出现此错误
forms.py", line 36, in __init__
super().__init__(*args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'instance'
[29/Feb/2020 18:40:13] "GET /Register/create/ HTTP/1.1" 500 115893
我也尝试过类CreateRegisterView(FormView):但是我在这行form.instance.user = self.request.user
问题是您使用了Form
,不是使用了ModelForm
。简单的Form
没有.instance
,并且对.save()
一无所知,因为Form
的任务只是处理GET
或POST
数据,并进行验证和清除。构建在ModelForm
顶部的Form
可以加载,更新和保存模型对象。因此,您应该从ModelForm
继承子类,并提供Meta
:
class CreateForm_test(forms.ModelForm):
name = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Name'}))
street = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Street'}))
number = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Number'}))
comment = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Comment'}))
phone = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Phone'}))
status = forms.CharField(widget=forms.TextInput(attrs={'placeholder': 'Status'})
class Meta:
model = Register
fields = ['name', 'street', 'number', 'comment', 'phone', 'status']
此外,如documentation中所指定,您需要在助手中指定操作:
class CrispyAddressForm(CreateForm_test):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_action = 'name_of_createview'
self.helper.layout = Layout(
Row(
Column('name', css_class='form-group col-md-6 mb-0'),
css_class='form-row'
),
'street',
'number',
Row(
Column('comment', css_class='form-group col-md-6 mb-0'),
Column('phone', css_class='form-group col-md-2 mb-0'),
Column('status', css_class='form-group col-md-2 mb-0'),
css_class='form-row'
),
Submit('submit', 'Submit')
)
我认为,主要问题是我两次定义了字段。在模型中一次,在我的表单中一次。
现在可以正常工作:表格
class CreateForm_test(forms.ModelForm):
class Meta:
model = Register
fields = ['name', 'street', 'number', 'comment', 'phone', 'status']
class CrispyAddressForm(CreateForm_test):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.layout = Layout(
Row(
Column('name', css_class='form-group col-md-7 mb-0'),
css_class='form-row'
),
Row(
Column('street', css_class='form-group col-md-6 mb-0'),
Column('number', css_class='form-group col-md-1 mb-0'),
css_class='form-row'
),
Row(
Column('comment', css_class='form-group col-md-6 mb-0'),
css_class='form-row'
),
Row(
Column('phone', css_class='form-group col-md-6 mb-0'),
css_class='form-row'
),
Submit('submit', 'Submit')
)
观看次数
class CreateRegisterView(CreateView):
model = Register
message = _("saved")
form_class = CreateForm
template_name = 'register_form.html'
def form_valid(self, form):
if self.request.user.is_authenticated:
form.instance.user = self.request.user
return super().form_valid(form)
def get_success_url(self):
messages.success(self.request, self.message)
return reverse('home')
型号
class Register(models.Model):
CREATED = "C"
DELETED = "D"
STATUS = (
(CREATED, _("Created")),
(DELETED, _("Deleted")),
)
user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, related_name="author", on_delete=models.SET_NULL, default=1)
timestamp = models.DateTimeField(auto_now=True)
created_at = models.DateTimeField(default=datetime.now)
status = models.CharField(max_length=1, choices=STATUS, default=CREATED)
comment = models.CharField(max_length=42, null=True, unique=False, blank=True)
edited = models.BooleanField(default=False)
objects = ArticleQuerySet.as_manager()
name = models.CharField(max_length=35, null=True, unique=False)
street = models.CharField(max_length=42, null=True, unique=False, blank=True)
number = models.CharField(blank=True, null=True, max_length=6)
phone = models.CharField(max_length=15, blank=True, null=True)
zip = models.CharField(max_length=42, null=True, unique=False, blank=True)
city = models.CharField(max_length=42, null=True, unique=False, blank=True)
class Meta:
verbose_name = _("Register")
verbose_name_plural = _("Register")
ordering = ("-timestamp",)
def __str__(self):
return self.name
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
html
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
{% crispy form %}
{% endblock %}
要理解,对于crispyforms,我有两种格式设置形式。首先是表单,第二个是html。
当我将视图更改为form_class = CreateForm_test
和html
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<form method="post" novalidate>
{% csrf_token %}
<div class="form-row">
<div class="form-group col-md-6 mb-0">
{{ form.name|as_crispy_field }}
</div>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
{% endblock %}
然后不再起作用,第一个以表格格式设置的示例正在起作用。在第二个html中,我仅添加了字段name
,因为只有这是必填字段。
html格式不起作用有什么区别?该表单在浏览器中可见,但不保存,没有错误。