Форма Django Model Multi Select отображается неправильно
Я пытаюсь отобразить все категории в виде списка, который я могу нажать и выбрать, просто точная копия того, что у меня есть в моей панели администратора, но он все еще отображается как список, который не кликабелен.
forms.py
class ProfileEditForm(forms.ModelForm):
"""
Form for updating Profile data
"""
class Meta:
model = Profile
fields = [
"first_name",
"last_name",
"about_me",
"profile_image",
"username",
"email",
"categories",
]
first_name = forms.CharField(label="First Name", max_length=63, required=False)
last_name = forms.CharField(label="Last Name", max_length=63, required=False)
about_me = forms.CharField(label="About Me", max_length=511, required=False)
email = forms.EmailField(label="Email", disabled=True)
username = forms.CharField(label="Username", disabled=True)
profile_image = forms.ImageField(required=False)
categories = forms.ModelMultipleChoiceField(
queryset=Category.objects.all(),
required=False,
widget=forms.CheckboxSelectMultiple(),
)
settings.html
<div class='row'>
<div class="col s12 m6">
{{form.categories.errors}}
{{form.categories.label_tag}}
{{form.categories}}
</div>
</div>
Вам необходимо создать саму форму:
<form method='post'>
</form>
И выведите каждое поле на новой строке:
{{ form.as_p }}
является проверкой безопасности.
{% csrf_token %}
В представлении я оставил get_context_data. В нем вы можете добавлять значения в контекст, например, так:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['rubrics'] = Car.objects.all()
Замените bboard на название папки, в которой находятся ваши шаблоны. У меня это: templates/bboard, которые находятся в папке приложения.
В представлении для формы используется класс CreateView, в котором: template_name - имя шаблона для отображения страницы, form_class - указывается класс формы, success_url - куда возвращаться в случае успешного сохранения формы (в данном случае это та же страница с формой), get_context_data - контекст шаблона (можно распечатать и посмотреть, что внутри).
template_name = 'bboard/tam_form.html'
Шаблоны
<form method='post'>
{{form.categories.errors}}
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value='adding'>
</form>
views.py
from .forms import *
from django.views.generic.edit import CreateView
from django.urls import reverse_lazy
class Profile(CreateView):
template_name = 'bboard/settings.html'
form_class = ProfileEditForm
success_url = reverse_lazy('test')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
return context
urls.py
from django.urls import path
from .views import *
urlpatterns = [
path('test/', Profile.as_view(), name='test'),
]