2 回答
TA贡献1801条经验 获得超15个赞
我的问题是我没有区分UpdateView类中的“GET”和“POST”调用,我试图在post()方法中做所有事情。我花了一段时间才弄清楚,但现在我认为这很清楚。我最初使用get()方法,但我意识到get_context_data()更适合,因为它会自动加载大部分上下文(例如实例和表单),而不必在get()方法中从头开始做所有事情.
在这里浏览 UpdateView 类的代码,似乎还需要将 ModelFormMixin 添加到PartUpdate类的声明中,以便get_context_data()方法自动加载与目标模型/实例关联的表单(否则它看起来不会不要这样做)。
这是我更新的views.py代码:
class PartUpdate(UpdateView, ModelFormMixin):
model = PhysicalPart
template_name = 'part_update.html'
form_class = PartForm
success_url = reverse_lazy('part-list')
def get_context_data(self, **kwargs):
# Load context from GET request
context = super(PartUpdate, self).get_context_data(**kwargs)
# Get id from PhysicalPart instance
context['part_id'] = self.object.id
# Get category from PhysicalPart instance
context['part_category'] = self.object.category
# Add choices to form 'subcategory' field
context['form'].fields['subcategory'].choices = SubcategoryFilter[self.object.category]
# Return context to be used in form view
return context
def post(self, request, *args, **kwargs):
# Get instance of PhysicalPart
self.object = self.get_object()
# Load form
form = self.get_form()
# Add choices to form 'subcategory' field
form.fields['subcategory'].choices = SubcategoryFilter[self.object.category]
# Check if form is valid and save PhysicalPart instance
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
TA贡献1806条经验 获得超5个赞
据我了解,您正在尝试编辑实例。这就是您在 Django 中的操作方式,它应该使用正确的值自动填充您的输入:
my_record = MyModel.objects.get(id=XXX) form = MyModelForm(instance=my_record)
有关此答案的更多详细信息:如何使用 django 表单编辑模型数据
如果您的模型正确完成(使用关系),则不需要为 Select 提供选项。
添加回答
举报