Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以使用django表单吗?_Django_Django Models_Django Forms - Fatal编程技术网

可以使用django表单吗?

可以使用django表单吗?,django,django-models,django-forms,Django,Django Models,Django Forms,我有一个表单,管理员在其中输入逗号分隔的电子邮件地址列表,该表单在将每个电子邮件地址添加到数据库之前对其进行验证。通过使用自己的(非django)表单,我可以很好地做到这一点。我尝试将此迁移到使用modelforms,但遇到了一些问题。这是我目前拥有的代码-- 我遇到了问题,因为在验证表单之前,我无法调用cleaned_data(),但是表单不会作为一个整体进行验证(只有其迭代会)。是否可以使用django的表单构造此函数?如果是,我将如何完成这项任务?谢谢。在本例中,我不会使用ModelFor

我有一个表单,管理员在其中输入逗号分隔的电子邮件地址列表,该表单在将每个电子邮件地址添加到数据库之前对其进行验证。通过使用自己的(非django)表单,我可以很好地做到这一点。我尝试将此迁移到使用modelforms,但遇到了一些问题。这是我目前拥有的代码--


我遇到了问题,因为在验证表单之前,我无法调用
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 }