带有PK而不是用户名的choicefield的ModelForm

2024-04-23 17:09:02 发布

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

我有一个由PostView生成的表单

class HotelCreateView(LoginRequiredMixin, CreateView):
    model = Hotel
    fields = ['hotel', 'code', 'collaborateurs', 'planning' 'payday']

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

modelcollaborators是一个显示用户名的选项字段。你知道吗

我想让这个字段来呈现PK,所以我试图创建自己的表单,但没有弄清楚。你知道吗

表单.py

 from django import forms 
 from .models import Hotel

class HotelForm(forms.Form):
   collaborateurs = forms.ModelChoiceField(queryset=collaborateurs.objects.all())

谢谢


Tags: fromimportselfform表单formshotelclass
1条回答
网友
1楼 · 发布于 2024-04-23 17:09:02

我建议您创建一个自定义小部件。你知道吗

创建“widgets”文件夹和“pk”-选择.html在一些“模板”文件夹。你知道吗

小工具/主键-选择.html你知道吗

<select name="{{ widget.name }}"{% include "django/forms/widgets/attrs.html" %}>
  {% for group_name, group_choices, group_index in widget.optgroups %}
    {% if group_name %}
      <optgroup label="{{ group_name }}">
    {% endif %}
    {% for option in group_choices %}
      <option value="{{ option.value|stringformat:'s' }}"{% include "django/forms/widgets/attrs.html" %}>{{ option.value }}</option>
    {% endfor %}
    {% if group_name %}
      </optgroup>
    {% endif %}
  {% endfor %}
</select>

然后,修改你的“表格.py“像这样

你知道吗表格.py你知道吗

from django.forms import ModelForm
from django.forms.widgets import Select
from .models import Hotel


class PkSelect(Select):
    template_name = 'widgets/pk-select.html'


class HotelCreateForm(ModelForm):
    class Meta:
        model = Hotel
        fields = ['hotel', 'code', 'collaborateurs', 'planning', 'payday']
        widgets = {
            'collaborateurs': PkSelect(attrs={})
        }

下一步,我要你在视图.py““

你知道吗视图.py你知道吗

class HotelCreateView(LoginRequiredMixin, CreateView):
    form_class = HotelCreateForm
    template_name = 'hotel_form.html'

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

这一行在“pk”中是哪个部分做了更改-选择.html““

<option value="{{ option.value|stringformat:'s' }}"{% include "django/forms/widgets/attrs.html" %}>{{ option.value }}</option>

最初,{{ option.value }}{{ widget.label }},正如您在GitHub页面上看到的那样。你知道吗

https://github.com/django/django/blob/master/django/forms/templates/django/forms/widgets/select_option.html

{{ widget.label }}在本例中显示用户名,因此我修改了这部分。你知道吗

我希望这就是你要找的,如果我的理解是错误的,请随时问我。你知道吗

相关问题 更多 >