0

Я создал дочернюю модель, связанную с родительской моделью через ForeignKey. Когда я пытался создать экземпляр Child, он ничего не возвращает. Я не уверен в своих взглядах на child.Parent работает нормально или нет. Буду признателен за помощь в решении этого вопроса.Django/python: Как назначить поле ForeignKey для дочерней модели в представлениях Django?

Вот мой код:

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 %}