Можно ли делать с формами Django? - PullRequest
1 голос
/ 31 мая 2011

У меня есть форма, в которой администраторы вводят список адресов электронной почты, разделенных запятыми, и форма проверяет каждый адрес электронной почты перед добавлением его в базу данных. Я был в состоянии сделать это очень хорошо с использованием моей собственной (не Django) формы. Я попытался перенести это на использование моделей, но столкнулся с несколькими проблемами. Вот код, который у меня сейчас есть -

# model
class EmailList(models.Model):
    email = models.EmailField(blank=True)
    network = models.ForeignKey(Network)

class EmailListForm(ModelForm):
    class Meta:
        model = EmailList

    def clean_email(self):
      if self.cleaned_data['email']:
          valid_emails = []
          for x in self.cleaned_data['email'].split(','):
              x = x.strip().lower()
              valid_emails.append(x)
          return valid_emails

# in views
def email(request):
    if request.POST.get('email'):
        for email in form.cleaned_data.get('email'):  ### ??
            if form.is_valid():                       ### ??
                EmailList.objects.create(email = email, network=Network.objects.get(id=request.POST['network']))
        return redirect('.')

У меня проблемы, потому что я не могу вызвать cleaned_data(), пока форма не будет проверена, но форма не будет проверена в целом (будут только ее итерации). Можно ли построить эту функцию, используя формы Джанго? Если да, то как бы я справился с этой задачей? Спасибо.

1 Ответ

2 голосов
/ 31 мая 2011

В этом случае я бы не использовал ModelForm, потому что они предназначены для случая, когда вы хотите представить один экземпляр модели одной формой.Здесь вы хотите создать несколько экземпляров с одной формой.Поэтому просто напишите общую форму с настраиваемым полем (точный пример есть в Django docs ) и, возможно, пользовательский метод сохранения:

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 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...