#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
в объявлении поля модели, чтобы предотвратить недопустимые данные на уровне базы данных, если они проскальзывают через приложение