Django Forms, имеющие несколько моделей в метаклассе?

Можем ли мы определить несколько моделей в части «Метакласс» формы?

Вот мой пример:

from django import forms

from django.contrib.auth.models import User , Group

from django.forms import ModelForm

from django.utils.translation import ugettext as _

from profiles.models import Student , Tutor 


class RegistrationForm(ModelForm):
    email           = forms.EmailField(label=_('Email Address:'))
    password        = form.CharField(label=_('Passsword:') , widget = forms.PasswordInput(render_value = False))
    password1       = form.CharField(label=_('Verify Passsword:') , widget = forms.PasswordInput(render_value = False))

    class Meta:
        model = [Student , Tutor] ## IS THIS TRUE ???

person Soask    schedule 19.06.2012    source источник
comment
Я никогда этого не видел. Я думаю, вам следует использовать несколько ModelFom или одну форму и использовать ее данные для создания экземпляра каждой модели, а затем Model.save() для каждой.   -  person machaku    schedule 19.06.2012
comment
@Secator: Что ты имеешь в виду? Я хотел бы написать регистрационную форму с нуля. У меня есть как минимум два актера в системе: Студент и Репетитор...   -  person Soask    schedule 19.06.2012
comment
@Machaku: Ты имеешь в виду что-то вроде ответа на блуждание?   -  person Soask    schedule 19.06.2012
comment
Это не плохой вопрос, это нормальный вопрос. Я думаю, что это должен быть хороший способ сделать это.   -  person Goin    schedule 19.06.2012


Ответы (3)


Нет. Но тебе и не нужно. Вместо создания и проверки одной формы сделайте это для каждого типа форм, которые вам необходимо поддерживать.

# Define your model forms like you normally would
class StudentForm(ModelForm):
    ...

class TutorForm(ModelForm):
    ...

class RegistrationForm(Form):
    email = ...
    ...

# Your (simplified) view:
...
context = {
    'student_form': StudentForm(),
    'tutor_form': TutorForm(),
    'registration_form': RegistrationForm()
}
return render(request, 'app/registration.html', context)

# Your template
...
<form action="." method="post">
    {{ student_form }}
    {{ tutor_form }}
    {{ registration_form }}
    <input type="submit" value="Register">
</form>

Если это означает, что имена полей дублируются в разных формах, используйте форму префиксы, чтобы разобраться в этом.

person roam    schedule 19.06.2012
comment
Большое спасибо за ваш полный ответ ... Я должен подумать и полностью понять это, но пункты, которые сделал ваш пример, были отличными намеками .. - person Soask; 19.06.2012

Нет, в классе Meta невозможно определить несколько моделей.

Вы можете создать форму модели для каждой модели, а затем поместить несколько форм в один и тот же тег html <form>, используя префиксы префикс аргумент.

Затем, по вашему мнению, вы можете проверить, что каждая форма модели действительна перед сохранением.

Обратите внимание, что приложение django contrib.auth поставляется с UserCreationForm (просмотреть исходный код ). Вероятно, вы можете повторно использовать это вместо написания собственной формы.

person Alasdair    schedule 19.06.2012
comment
Я видел источник UserCreationForm. Я думаю, что мне нужно настроить его, так как я аутентифицирую пользователей по их электронной почте. Но как я могу адаптировать их на основе этих двух Актеров, которые у меня есть (Студент и Репетитор) ?? я немного в замешательстве.. - person Soask; 19.06.2012
comment
Создание подкласса UserCreationForm для настройки поведения может быть лучше, чем написание собственной формы с нуля. Вам не нужно адаптировать форму для моделей Student и Tutor - просто определите отдельный StudentForm в своем представлении и поместите его в тот же тег html, как предлагают мои ответы и ответы @roam. - person Alasdair; 19.06.2012

определите свои модели в form.py

form1 #используя 1-ю модель

form2 #используя 2-ю модель

теперь отредактируйте свой views.py в методе get

args = {

"form1" = form1(),

"form2" = form2()

}

return render(request, "template_name", args)

теперь отредактируйте свой шаблон

<form .....>

form1.as_p

form2.as_p

...

</form>

person Sandeep Chauhan    schedule 06.02.2018