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
Никога не съм виждал това. Мисля, че трябва да използвате множество ModelFoms или единичен формуляр и да използвате неговите данни, за да направите екземпляр на всеки модел, след което Model.save() за всеки.   -  person machaku    schedule 19.06.2012
comment
@Secator : Какво имаш предвид? Бих искал да напиша формуляр за регистрация от нулата. Имам поне двама участници в системата: ученик и преподавател...   -  person Soask    schedule 19.06.2012
comment
@Machaku: Имаш предвид нещо като отговора на roam?   -  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