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)
我有一个模型(父模型):
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)