Рендеринг PK вместо имени пользователя в CreateView - PullRequest
0 голосов
/ 04 марта 2019

Я создаю приложение, в котором менеджеры могут создавать частные веб-страницы, им нужно добавлять людей вручную, чтобы они могли получить доступ к странице.

Я не хочу, чтобы менеджеры видели всех пользователей, Поэтому я хотел бы отображать только PK в списке.

Мои views.py

class HotelCreateView(LoginRequiredMixin, CreateView):
model = Hotel
form_class = HotelForm

def form_valid(self, form):
    form.instance.manager_hotel = self.request.user
    return super().form_valid(form)

forms.py

from django.db import models
from django.forms import ModelForm
from .models import Hotel

class ColleagueChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
         return obj.get_pk()

class HotelForm(models.Model):
    ColleagueModelChoiceField(queryset=Colleague.objects.filter(pk))

1 Ответ

0 голосов
/ 04 марта 2019

Вы устанавливаете fields на своем CreateView, поэтому вы позволяете Django автоматически генерировать ModelForm для вас.Форма использует ModelMultipleChoiceField, который происходит от ModelChoiceField, описанного здесь .

Если вы прочитаете последний абзац этого раздела, вы увидите, что отображаемые значения для такого поля получены из метода __str__ модели, или вы можете переопределить его с помощью метода label_from_instance().

Поэтому вам нужно переопределить этот метод на ModelMultipleChoiceField.Но для этого вам нужно указать свою собственную форму.

Итак:

  • Создайте свой собственный ModelForm для вашей Hotel модели (HotelForm).
  • Создайте подкласс ModelMultipleChoiceField (ColleagueChoiceField) и переопределите метод label_from_instance() для отображения pk.
  • Установите для поля colleagues в HotelForm значение ColleagueChoiceField.
  • Удалите атрибут fields в вашем представлении и установите вместо form_class значение HotelForm.
...