0

我創建了一個通過ForeignKey連接到父模型的子模型。當我嘗試創建一個Child實例時,它不會返回任何內容。我不確定在我的意見child.Parent工作是否正常。我希望能幫助我解決這個問題。Django/python:如何在Django視圖中爲子模型分配ForeignKey字段?

這裏是我的代碼:

models.py:

Parent(models.Model): 
    Parent = models.CharField(max_length=30) 

    def __str__(self): 
     return self.id 

    def get_absolute_url(self): 
     return reverse("parents:detail", kwargs={"id": self.id}) 

Child(models.Model): 
    Parent = models.ForeignKey(Parent, related_name='children') 
    Child = models.CharField(max_length=30)   

    def __str__(self): 
     return self.id 

forms.py:

ChildForm(models.ModelForm): 
    Parent = forms.CharField(widget=forms.HiddenInput) 
    class Meta: 
     model = Child 
     fields = ["Parent", "Child", 
     ] 

views.py:

def child_create(request, id): 
    parent_instance = get_object_or_404(Parent, id=id) 
    form = ChildForm(request.POST or None) 
    if form.is_valid(): 
     child = form.save(commit=False) 
     child.Parent = form.cleaned_data.get('parent_id') 
     child.save() 
     return HttpResponseRedirect(parent_instance.get_absolute_url()) 
    context = { 'form':form, 'parent_instance':parent_instance,} 

    return render(request, "child_create.html", context) 

模板/ child_create.html :

{{if parent_instance.id}} 
<form class="nomargin" method='POST' action='' enctype='multipart/form-data'>{% csrf_token %} 
     {{ form|crispy }} 

     <input type='hidden' name='parent_id' value='{{ parent_instance.id }}' /> 
     <input type='submit' value='Add a Child' class='btn btn-default' /> 
    </form> 

{% endif %} 
+1

'child.Parent = form.cleaned_data.get('parent_id')'應該是'child.Parent = parent_instance' – e4c5

+0

謝謝老兄,一個小小的錯誤! – sumanth

回答

0

使用ModelChoiceField而不是CharField

forms.py:

ChildForm(models.ModelForm): 
    Parent = forms.ModelChoiceField(queryset=Parent.objects.all(), 
             widget=forms.HiddenInput()) 
    class Meta: 
     model = Child 
     fields = ["Parent", "Child",] 

views.py:

def child_create(request, id): 
    parent_instance = get_object_or_404(Parent, id=id) 
    form = ChildForm(request.POST or None) 
    if form.is_valid(): 
     child = form.save(commit=False) 
     child.save() 
     return HttpResponseRedirect(parent_instance.get_absolute_url()) 
    context = { 'form':form, 'parent_instance':parent_instance,} 

    return render(request, "child_create.html", context) 

模板/ child_create.html:

{{if parent_instance.id}} 
<form class="nomargin" method='POST' action='' enctype='multipart/form-data'> 
    {% csrf_token %} 

    {{ form|crispy }} 

    <input type='hidden' name='Parent' value='{{ parent_instance.pk }}' /> 
    <input type='submit' value='Add a Child' class='btn btn-default' /> 
</form> 
{% endif %} 
相關問題