django: ForeignKeyField limit_choices_to "parents pk"?

django: ForeignKeyField limit_choices_to "parents pk"?

我有一个模型(父模型):

class Post(models.Model):
    image = models.ImageField(upload_to='%Y/%m/%d')
    title = models.CharField(max_length=200)
    width = models.DecimalField(max_digits=3, decimal_places=0)
    height = models.DecimalField(max_digits=3, decimal_places=0)
    year = models.PositiveIntegerField()


    def __str__(self):
        return self.title

和另一个模型(儿童模型):

class Addimg(models.Model):

    post = models.ForeignKey('Post', null=True)
    addimg = models.ImageField(upload_to='%Y/%m/%d')

    def __str__(self):
        return self.post

我的添加表格:

class AddimgForm(forms.ModelForm):
    class Meta: 
        model = Addimg 
        fields = ('post', 'addimg', 'width', 'height',)

views.py 使用格式:

def addimg(request, pk):
    if request.method == "POST":
        form = AddimgForm(request.POST, request.FILES)
        post = get_object_or_404(Post, pk=pk)
        if form.is_valid():
            addimg = form.save(commit=False)
            addimg.addimg = request.FILES['addimg']
            addimg.save()
            return redirect('blog.views.detail', pk=post.pk)
    else:
        form = AddimgForm()
    return render(request, 'blog/edit.html', {'form': form})

我的问题是,当我创建一个 "Child model" 我的 post 字段时 returns 所有已经创建的实例 Post 模型作为选择。我想要的是它自动只显示与它相关的 Post 而无需选择。 ForeignKey 是合适的模型吗?

任何关于这如何运作的想法。谢谢

您要做的是创建一个 Many-to-one relationship。例如,

post = models.ForeignKey('Post', null=True)

这意味着您可以对其进行过滤,例如,

Addimg.objects.filter(post=Post)
or
Post.objects.get(pk=1)
Post.addimg_set.filter(xyz=etc)

在此处阅读更多内容:https://docs.djangoproject.com/en/1.8/topics/db/examples/many_to_one/

ForeignKey 字段在 Django ModelForm 中被翻译成 ModelChoiceField。如果您检查 class,您会注意到这种类型的字段需要一个 queryset 属性。默认情况下,Django 提供了完整的对象集。您可以通过提供表单需要的 parent 对象在表单 __init__ 方法中覆盖它。

考虑以下示例代码:

def addimg(request, pk):
    post = get_object_or_404(Post, pk=pk)
    if request.method == "POST":
        form = AddimgForm(request.POST, request.FILES, post=post)
        #...
    else:
        form = AddimgForm(post=post)
    return render(request, 'blog/edit.html', {'form': form})


class AddimgForm(forms.ModelForm):
    class Meta: 
        model = Addimg 
        fields = ('post', 'addimg', 'width', 'height',)

    def __init__(self, *args, **kwargs):
        post = kwargs.pop('post')
        super(AddimgForm, self ).__init__(*args, **kwargs)
        self.fields['post'].queryset = Post.objects.filter(id=post.id)