[英]Django: Use post() in UpdateView to populate form's fields with instance's existing field values
[英]Django UpdateView: cannot get form fields to show database values
我找到了相同問題的多個答案,但不幸的是,我似乎無法弄清楚:(
該表單在我的模型“PhysicalPart”中有一個“subcategory”字段的下拉列表,“subcategory”字段的值在創建表單時動態更新(使用“category”參數)。
不幸的是,我無法讓下拉菜單顯示所有子類別,並且無法同時選擇數據庫中的子類別。 我似乎無法從數據庫中檢索“short_description”值。
在我了解 UpdateView 類並決定改用它之前,它曾經工作過......
任何有關如何解決我的問題的見解將不勝感激!
表格.py
class PartForm(forms.ModelForm):
subcategory = forms.ChoiceField(choices=[])
class Meta:
model = PhysicalPart
fields = ['subcategory', 'short_description']
視圖.py
class PartUpdate(UpdateView):
model = PhysicalPart
template_name = 'part_update.html'
form_class = PartForm
def post(self, request, *args, **kwargs):
# Load model instance
self.object = self.get_object()
# Load form
form = super(PartUpdate, self).get_form(self.form_class)
# Populating subcategory choices
form.fields['subcategory'].choices = SubcategoryFilter[self.object.category]
# Check if form valid and save data
if form.is_valid():
form.save()
return redirect('part-list')
# Update context before rendering
context = self.get_context_data(**kwargs)
context['part_id'] = self.object.pk
context['part_category'] = self.object.category
context['manufacturing_list'] = self.object.manufacturing.all()
return render(request, self.template_name, context)
html
<form action="{% url 'part-update' pk=part_id category=part_category %}" method="post" style="display: inline">
{% csrf_token %}
<div class="form">
<p class="font-weight-bold">Type</br>
{{ form.subcategory }}
</p>
</div>
<div class="form">
<p class="font-weight-bold">Short Description</br>
{{ form.short_description }}
</p>
</div>
<button type="submit" class="btn btn-primary">Save</button>
</form>
<form action="{% url 'part-list' %}" style="display: inline">
<button type="submit" class="btn btn-danger">Cancel</button>
</form>
據我了解,您正在嘗試編輯一個實例。 這就是你在 Django 中的做法,它應該使用正確的值自動填充你的輸入:
my_record = MyModel.objects.get(id=XXX)
form = MyModelForm(instance=my_record)
有關此答案的更多詳細信息: how to edit model data using django forms
如果您的模型正確完成(有關系),您就不需要為 Select 提供選項。
我的問題是我沒有區分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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.