我正在构建一个应用程序,管理人员可以在其中创建一个私人网页,他们需要手动添加人员才能访问该页面。
我不希望经理看到所有用户,所以我只想在列表中呈现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)
表格
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))
最佳答案
您在fields
上设置了CreateView
,因此让Django为您自动生成ModelForm
。表单使用从ModelMultipleChoiceField
派生的ModelChoiceField
,描述为here。
如果您阅读了该部分的最后一段,您将看到该字段的显示值来自模型的__str__
方法,或者可以用label_from_instance()
方法覆盖它。
因此,这就是您需要做的,在ModelMultipleChoiceField
上覆盖此方法。但是要做到这一点,您需要指定自己的形式。
所以:
为您的Hotel
模型(HotelForm
)创建自己的ModelForm。
创建ModelMultipleChoiceField
(ColleagueChoiceField
)的子类,并覆盖label_from_instance()
方法以显示pk
。
将colleagues
上的HotelForm
字段设置为ColleagueChoiceField
。
删除视图上的fields
属性,并将form_class
设置为HotelForm
。
关于python - 在CreateView中呈现PK而不是用户名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54983551/