Все решения, которые я нашел, forms.py
, но поскольку я использую UpdateView
, я не буду использовать виджет в формах.
Ну, одно не исключает другоесовсем.Фактически, очень часто указывается класс формы в CreateView
с и UpdateView
с.Даже если вы сами не указали Form
, за занавесом ваш UpdateView
сконструирует для вас элемент с элементами по умолчанию.Действительно, в классе ModelFormMixin
[GitHub] мы видим:
class ModelFormMixin(FormMixin, SingleObjectMixin):
# ...
def get_form_class(self):
# ...
<b>return model_forms.modelform_factory(model, fields=self.fields)</b>
, поэтому за занавесом он используетmodelform_factory
для построения ModelForm
для вас с fields
, который вы предоставили.Но ничто не мешает вам указать свою собственную форму и использовать эту форму.
В forms.py
вы можете указать в своем AddPersonForm
, что вы хотите использовать RadioSelect
[Django-doc] , хотя, поскольку members
, скорее всего, отношение «многие ко многим», CheckboxSelectMultiple
[Django-doc] более уместно:
# app/forms.py
from app.models import Trip
from django import forms, <b>RadioSelect</b>
class AddPerson<b>Form</b>(forms.ModelForm):
class Meta:
model = Trip
fields = ['members']
widgets = {
<b>'members': RadioSelect()</b>
}
По вашему мнению, вы можете использовать ваш AddPersonForm
:
# app/views.py
from django.views.generic.edit import UpdateView
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from app.models import Trip
from app.forms import <b>AddPersonForm</b>
class AddPersonView(LoginRequiredMixin, UserPassesTestMixin, UpdateView)
model = Trip
template_name = 'tripplanner/add_new_member.html'
<b>form_class = AddPersonForm</b>
success_url = '/'
# ...
def test_func(self):
detailView = self.get_object()
user = self.request.user
return user in detailView.members.all() or user in detailView.owners.all()