ModelForm для поля выбора с PK вместо имен пользователей

У меня есть форма, сгенерированная 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())

Спасибо

Вы имели в виду Forms.ChoiceField, а не Forms.ColleagueChoiceField?

xxx 06.03.2019 00:28

Да, моя ошибка. но даже при этом нет изменений в моей форме

user11005819 06.03.2019 00:30

Возможный дубликат Поле выбора модели. ID вместо имени

xxx 06.03.2019 00:31

Я попробовал это, но не работает для моего случая: 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

user11005819 06.03.2019 00:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
264
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я рекомендую вам создать собственный виджет.

Создайте папку "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.

https://github.com/django/django/blob/master/django/forms/templates/django/forms/widgets/select_option.html

{{ widget.label }} в этом случае показывает имя пользователя, поэтому я изменил эту часть.

Я надеюсь, что это то, что вы ищете, не стесняйтесь спрашивать меня, если я неправильно понимаю.

Другие вопросы по теме