У меня есть форма, сгенерированная PostView
class HotelCreateView(LoginRequiredMixin, CreateView):
model = Hotel
fields = ['hotel', 'code', 'collaborateurs', 'planning' 'payday']
def form_valid(self, form):
form.instance.manager_hotel = self.request.user
return super().form_valid(form)
Модель сотрудники — это поле выбора, отображающее имена пользователей.
Я хочу, чтобы это поле вместо этого отображало PK, поэтому я попытался создать свою собственную форму, но не смог понять.
формы.py
from django import forms
from .models import Hotel
class HotelForm(forms.Form):
collaborateurs = forms.ModelChoiceField(queryset=collaborateurs.objects.all())
Спасибо
Да, моя ошибка. но даже при этом нет изменений в моей форме
Возможный дубликат Поле выбора модели. ID вместо имени
Я попробовал это, но не работает для моего случая: class HotelCreateView(LoginRequiredMixin, CreateView): model = Hotel fields = ['hotel','code','collaborateurs', 'planning','payday'] def form_valid(self, form): form.instance.manager_hotel = self.request.user return super().form_valid(form) Hotel = form.cleaned_data['collaborateurs'].id






Я рекомендую вам создать собственный виджет.
Создайте папку "widgets" и "pk-select.html" в какой-нибудь папке "templates".
виджеты/pk-select.html
<select name = "{{ widget.name }}"{% include "django/forms/widgets/attrs.html" %}>
{% for group_name, group_choices, group_index in widget.optgroups %}
{% if group_name %}
<optgroup label = "{{ group_name }}">
{% endif %}
{% for option in group_choices %}
<option value = "{{ option.value|stringformat:'s' }}"{% include "django/forms/widgets/attrs.html" %}>{{ option.value }}</option>
{% endfor %}
{% if group_name %}
</optgroup>
{% endif %}
{% endfor %}
</select>
Затем измените свой «form.py» следующим образом.
form.py
from django.forms import ModelForm
from django.forms.widgets import Select
from .models import Hotel
class PkSelect(Select):
template_name = 'widgets/pk-select.html'
class HotelCreateForm(ModelForm):
class Meta:
model = Hotel
fields = ['hotel', 'code', 'collaborateurs', 'planning', 'payday']
widgets = {
'collaborateurs': PkSelect(attrs = {})
}
Затем я хочу, чтобы вы немного изменили файл «view.py».
view.py
class HotelCreateView(LoginRequiredMixin, CreateView):
form_class = HotelCreateForm
template_name = 'hotel_form.html'
def form_valid(self, form):
form.instance.manager_hotel = self.request.user
return super().form_valid(form)
Какая часть внесла изменения в эту строку внутри "pk-select.html"
<option value = "{{ option.value|stringformat:'s' }}"{% include "django/forms/widgets/attrs.html" %}>{{ option.value }}</option>
Изначально {{ option.value }} было {{ widget.label }}, как вы можете видеть на странице GitHub.
{{ widget.label }} в этом случае показывает имя пользователя, поэтому я изменил эту часть.
Я надеюсь, что это то, что вы ищете, не стесняйтесь спрашивать меня, если я неправильно понимаю.
Вы имели в виду Forms.ChoiceField, а не Forms.ColleagueChoiceField?