【问题标题】:Django/python : How to assign the ForeignKey field for the child model in Django views?Django/python:如何在 Django 视图中为子模型分配 ForeignKey 字段?
【发布时间】:2017-05-03 02:43:04
【问题描述】:

我创建了一个通过 ForeignKey 连接到父模型的子模型。当我尝试创建一个 Child 实例时,它什么也不返回。我不确定我的观点 child.Parent 是否正常工作。我将不胜感激帮助我解决这个问题。

这是我的代码:

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

【问题讨论】:

  • child.Parent = form.cleaned_data.get('parent_id') 应该是child.Parent = parent_instance
  • 谢谢老兄,一个小错误!!

标签: django django-models django-forms foreign-keys django-views


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-12-15
    • 2017-04-19
    • 2018-03-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    相关资源
    最近更新 更多