在 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
。
我正在构建一个应用程序,管理人员可以在其中创建私人网页,他们需要手动添加人员才能访问该页面。
我不想让管理员看到所有的用户,所以我想只渲染列表中的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
。