Django: возможно ли проверить и сохранить поля нескольких форм в одном общем представлении?

#django #django-models #django-forms

#django #django-модели #django-forms

Вопрос:

У меня есть 2 модели:

 class Person( models.Model ):
  username = models.CharField
  name = models.CharField( max_length = 30 )
  surname = models.CharFields( max_length = 30 )
  ...

class PersonSkills( models.Model ):
  person = models.ForeignKey( Person )
  skill = models.CharField( max_length = 30 )
  ...
  

Я хотел бы добавить данные в Person и в PersonSkills в одном представлении.

Теперь у меня есть RegisterView, подобный следующему:

 class RegisterForm( ModelForm ):
    class Meta:
        model = Person
        fields = ( 'username', 'name', 'surname', 'password', )

class RegisterView( FormView ):
    form_class = RegisterForm
    success_url = "/welcome/"
    template_name = "register.tmpl"
    is_valid = True
    def form_valid( self, form ):       
        form.save()
        self.is_valid = True
        return super( RegisterView, self ).form_valid( form )
    def form_invalid( self, form ):
        self.is_valid = False       
        return super( RegisterView, self).form_invalid( form )
    ...
  

Итак, как я могу добавить данные в Person и в PersonSkills в одном представлении? Наследование от FormView допускает только один form_class.

Комментарии:

1. Следует отметить еще одну вещь. Почему у вас есть модель Person? Это почти точно то же самое, что и встроенные в contrib.auth.models . Пользовательская модель. Вы должны использовать пользовательскую модель там, где это уместно.

Ответ №1:

Лучший способ достичь желаемого — создать пользовательскую форму, в которой объявляются поля, требуемые для обеих моделей. Используйте save метод формы для сохранения в отдельных классах модели, получая доступ к полям внутри cleaned_data .

Тогда ваш FormView будет работать должным образом. Он будет получать входные данные для двух разных моделей, но логика полностью содержится в форме. Как и во всех пользовательских формах, поместите логику проверки в различные *clean* методы.

Комментарии:

1. Извините. Вы имеете в виду поля формы объявления вручную (не используя привязку к модели) следующим образом: name = forms. CharField( max_length = 30)? В этом случае нам нужно позаботиться о ситуации, когда имя пользователя не уникально.

2. @serg это абсолютно то, что я имею в виду. Вы можете использовать clean_name метод формы (при условии, что поле называется name) для проверки этого конкретного поля. В настоящее время ваш вопрос не касается уникальности внутри формы или модели, но его легко выполнить. Посмотрите также на использование unique=True в объявлении поля модели, чтобы предотвратить недопустимые данные на уровне базы данных, если они проскальзывают через приложение