在发布自己的问题之前,我检查了很多相关问题,但我仍然无法弄清楚。使用 Django 2.2.x。
我希望owner
我的 html 表单字段最初只显示 1 个用户名,并且该用户名必须是当前event
实例所有者。
作为 a ModelChoiceField
,html 表单上的字段呈现为下拉列表。这个下拉列表暂时包含所有应用程序用户,因为ModelChoiceField
有queryset=User.objects.all()
我试图覆盖get_initial()
我的方法,UpdateView
但是,这对ModelChoiceField
. 我可以设置所有 forms.CharField() 初始值。
我也试图在没有运气的情况下覆盖__init__
我的方法。class EventForm(forms.ModelForm)
forms.py
class EventForm(forms.ModelForm):
class Meta:
model = Event
fields = ["customer", "owner", ...]
# the helper block comes from crispy_forms extension.
# It rules the form layout, allowing to specify css classes, fields order
# and even adding custom buttons
helper = FormHelper()
helper.layout = Layout(
Field('customer'),
Field('owner'),
...
Submit('submit', 'Update')
)
customer = forms.CharField(disabled=True)
owner = forms.ModelChoiceField(queryset=User.objects.all())
...
views.py
class EventUpdateView(LoginRequiredMixin, UpdateView):
""" this view renders the update form that allows service desk operators to update event status,
ownership and event notes
"""
model = Event
form_class = EventForm
template_name = "metamonitor/event_update_form.html"
def get_initial(self):
""" returns the initial data to populate form field on this view.
We override this method to customize the `owner` initial value to the
default event owner.
"""
initial = super().get_initial()
# the event instance being updated
event = self.get_object()
# this expression returns a queryset containing only 1 item,
# like <QuerySet [<User: operator2>]>
initial['owner'] = User.objects.filter(pk=event.owner.pk)
return initial
# without this, after a successfull event update we would get an error
# because django needs a valid url to redirect to.
def get_success_url(self):
# app_name:url_name, as defined in the corresponding path() `name` argument in urls.py
return reverse("metamonitor:event_update", kwargs={"pk": self.object.pk})
如何正确设置初始值?