在CreateVi中呈现PK而不是username

2024-04-26 18:24:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在建立一个应用程序,经理们可以创建一个私人网页,他们需要添加人手动,以便他们访问该页。你知道吗

我不想让管理员看到所有的用户,所以我只想呈现列表中的PK。你知道吗

我的视图.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)

表单.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))

Tags: djangoinstancefrompyimportselfformobj
1条回答
网友
1楼 · 发布于 2024-04-26 18:24:07

您在CreateView上设置了fields,因此让Django自动为您生成ModelForm。表单使用ModelMultipleChoiceField,它派生自ModelChoiceField,如here所述。你知道吗

如果您阅读了该部分的最后一段,您将看到这样一个字段的显示值来自模型的__str__方法,或者您可以用label_from_instance()方法覆盖它。你知道吗

因此,您需要在ModelMultipleChoiceField上重写此方法。但要做到这一点,您需要指定自己的表单。你知道吗

所以:

  • Hotel模型(HotelForm)创建自己的模型表单。你知道吗
  • 创建ModelMultipleChoiceFieldColleagueChoiceField)的子类并重写label_from_instance()方法以显示pk。你知道吗
  • HotelForm上的colleagues字段设置为ColleagueChoiceField。你知道吗
  • 删除视图上的fields属性,并将form_class设置为HotelForm。你知道吗

相关问题 更多 >