首页 > 解决方案 > Django post请求返回querydict而不是模型表单的对象ID

问题描述

我有模型

class CollectionForm(forms.ModelForm):
    Medicine_Name = forms.ModelChoiceField(queryset=Medicine.objects.all())
   
    class Meta:
        model = Medicine
        fields = ['Number_Of_Boxes', 'Last_Collected']

    def __init__(self, user = None, *args, **kwargs):
        super().__init__(*args, **kwargs)
        
        if user:
            self.fields['Medicine_Name'].queryset=Medicine.objects.filter(User_Associated=user)

以及处理表单的视图:

def update(request, *args, **kwargs):
     

        
    if request.method == 'POST':
        qd = request.POST['chosen_medicine']
       
        instance = Medicine.objects.get(id=qd)    
        form = CollectionForm(request.POST,  instance=instance)
       
        if form.is_valid():                 
            instance = form.save(commit=False)                
            instance.save()
    else:
        form = CollectionForm() 
    context = {'form': form,
            'meds': Medicine.objects.filter(User_Associated=request.user),
    }

    return render(request, 'tracker/medicine_collection.html', context )

表格的模板在这里:

<form method="POST" action = ''>
    {% csrf_token %}
    <label for="Medicine_Name">Medicine Name</label>
    <select class = "form-control" id = "Medicine_Name"  name = "chosen_medicine">
        {% for med in meds %}
          
            <option value = '{{med.auto_id}}'>{{ med.Medicine_Name }}</option>
        {% endfor %}
    
    </select>
           
    {{form.Number_Of_Boxes  }}
    
    {{form.Last_Collected }}
    
  
    <button class="btn btn-outline-info" type="submit">Create</button>
</form>

我正在尝试获取用户从下拉列表中选择的 Medicine_Name 的 ID。为此,我认为我有一个 POST 请求来获取 ID。但是,在提交我的表单时,我收到错误:

Field 'id' expected a number but got <QueryDict: {'csrfmiddlewaretoken': ['rrkPEpuZqxWQ9TS4lLMRDwAQ7xZAOUVZl8iHLVfZJ8gEfKundDMvDh9oWp42l1Jf'], 'chosen_medicine': ['1'], 'Number_Of_Boxes': ['3'], 'Last_Collected': ['03/16/2020']}>.

如何确保 POST 请求实际获取 ID,而不是包含表单所有字段的查询字典?

标签: pythondjangodjango-formsdjango-templates

解决方案


一些快速而混乱的东西可能会起作用。

data = dict(qd.iterlists())
instance = Medicine.objects.get(id=int(data.get('chosen_medicine')[0]))

但在我看来,如果你只需要一个 id,你甚至不应该发布整个查询集。


推荐阅读