可以使用django表单吗?
我有一个表单,管理员在其中输入逗号分隔的电子邮件地址列表,该表单在将每个电子邮件地址添加到数据库之前对其进行验证。通过使用自己的(非django)表单,我可以很好地做到这一点。我尝试将此迁移到使用modelforms,但遇到了一些问题。这是我目前拥有的代码--可以使用django表单吗?,django,django-models,django-forms,Django,Django Models,Django Forms,我有一个表单,管理员在其中输入逗号分隔的电子邮件地址列表,该表单在将每个电子邮件地址添加到数据库之前对其进行验证。通过使用自己的(非django)表单,我可以很好地做到这一点。我尝试将此迁移到使用modelforms,但遇到了一些问题。这是我目前拥有的代码-- 我遇到了问题,因为在验证表单之前,我无法调用cleaned_data(),但是表单不会作为一个整体进行验证(只有其迭代会)。是否可以使用django的表单构造此函数?如果是,我将如何完成这项任务?谢谢。在本例中,我不会使用ModelFor
我遇到了问题,因为在验证表单之前,我无法调用
cleaned_data()
,但是表单不会作为一个整体进行验证(只有其迭代会)。是否可以使用django的表单构造此函数?如果是,我将如何完成这项任务?谢谢。在本例中,我不会使用ModelForm
,因为它们适用于希望用一个表单表示一个模型实例的情况。在这里,您希望使用一个表单生成多个实例。因此,只需编写一个带有自定义字段的通用表单(中有一个具体的示例)以及一个自定义保存方法:
from django import forms
from django.core.validators import validate_email
class MultiEmailField(forms.Field):
def to_python(self, value):
"Normalize data to a list of strings."
# Return an empty list if no input was given.
if not value:
return []
return value.split(',')
def validate(self, value):
"Check if value consists only of valid emails."
# Use the parent's handling of required fields, etc.
super(MultiEmailField, self).validate(value)
for email in value:
validate_email(email)
class EmailListForm(forms.Form):
emails = forms.MulitEmailField()
network = forms.ModelChoiceField(queryset=Network.objects.all())
# save the emails to the db
def save(self):
for email in self.cleaned_data.get('emails'):
EmailList.objects.create(email = email,
network=self.network)
# in views
def email(request):
if request.method == 'POST':
form = EmailListForm(request.POST)
if form.is_valid():
form.save()
return redirect(...somewhere...)
else:
form = EmailListForm()
return render(request, 'some/template.html', { 'form': form }
谢谢,这非常有用。
class MultiEmailField
是在forms.py中还是在model中?非常欢迎:)它实际上在fields.py中与forms.py和models.py位于同一目录中
from django import forms
from django.core.validators import validate_email
class MultiEmailField(forms.Field):
def to_python(self, value):
"Normalize data to a list of strings."
# Return an empty list if no input was given.
if not value:
return []
return value.split(',')
def validate(self, value):
"Check if value consists only of valid emails."
# Use the parent's handling of required fields, etc.
super(MultiEmailField, self).validate(value)
for email in value:
validate_email(email)
class EmailListForm(forms.Form):
emails = forms.MulitEmailField()
network = forms.ModelChoiceField(queryset=Network.objects.all())
# save the emails to the db
def save(self):
for email in self.cleaned_data.get('emails'):
EmailList.objects.create(email = email,
network=self.network)
# in views
def email(request):
if request.method == 'POST':
form = EmailListForm(request.POST)
if form.is_valid():
form.save()
return redirect(...somewhere...)
else:
form = EmailListForm()
return render(request, 'some/template.html', { 'form': form }