在 CreateView 中呈现 PK 而不是用户名

Rendering PK instead of username in CreateView

我正在构建一个应用程序,管理人员可以在其中创建私人网页,他们需要手动添加人员才能访问该页面。

我不想让管理员看到所有的用户,所以我想只渲染列表中的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))

您在 CreateView 上设置 fields,因此您让 Django 自动为您生成 ModelForm。该表格使用 ModelMultipleChoiceField,它派生自 ModelChoiceField,描述为 here

如果您阅读该部分的最后一段,您会看到此类字段的显示值来自模型的 __str__ 方法,或者您可以使用 label_from_instance() 方法。

因此,这就是您需要做的,在 ModelMultipleChoiceField 上覆盖此方法。但为此,您需要指定自己的表单。

所以:

  • 为您的 Hotel 模型 (HotelForm) 创建您自己的 ModelForm。
  • 创建 ModelMultipleChoiceField (ColleagueChoiceField) 的子类并覆盖 label_from_instance() 方法以显示 pk.
  • HotelForm 上的 colleagues 字段设置为 ColleagueChoiceField
  • 删除视图中的 fields 属性并将 form_class 设置为您的 HotelForm