亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Django UpdateView:無法獲取表單字段以顯示數據庫值

Django UpdateView:無法獲取表單字段以顯示數據庫值

臨摹微笑 2022-07-12 10:08:45
我找到了相同問題的多個答案,但不幸的是,我似乎無法弄清楚:(該表單在我的模型“PhysicalPart”中有一個“子類別”字段的下拉列表,“子類別”字段的值在表單創建時動態更新(使用“類別”參數)。不幸的是,我無法讓下拉菜單顯示所有子類別并同時選擇數據庫中的一個。我似乎也無法從數據庫中檢索到“short_description”值。在我了解 UpdateView 類并決定改用它之前,它曾經可以工作......任何有關如何解決我的問題的見解將不勝感激!forms.pyclass PartForm(forms.ModelForm):subcategory = forms.ChoiceField(choices=[])class Meta:    model = PhysicalPart    fields = ['subcategory', 'short_description']views.pyclass PartUpdate(UpdateView):model = PhysicalParttemplate_name = 'part_update.html'form_class = PartFormdef 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>
查看完整描述

2 回答

?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

我的問題是我沒有區分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)


查看完整回答
反對 回復 2022-07-12
?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

據我了解,您正在嘗試編輯實例。這就是您在 Django 中的操作方式,它應該使用正確的值自動填充您的輸入:

my_record = MyModel.objects.get(id=XXX)
form = MyModelForm(instance=my_record)

有關此答案的更多詳細信息:如何使用 django 表單編輯模型數據

如果您的模型正確完成(使用關系),則不需要為 Select 提供選項。


查看完整回答
反對 回復 2022-07-12
  • 2 回答
  • 0 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號