Django外键查询集表单

Django外键查询集表单,django,django-models,django-forms,Django,Django Models,Django Forms,我有一张订单,上面有几样东西可以购买。这些项目(年度、问题和文章)通过外键附加到目录对象。我想更改表单模型中的queryset以显示附加项,而不是目录名称。我是Django的新手,有没有办法在表单中构造这种类型的queryset?我已经为每个模型添加了默认查询集all from crispy_forms.helper import FormHelper from crispy_forms.layout import Layout, ButtonHolder, Submit from subscr

我有一张订单,上面有几样东西可以购买。这些项目(年度、问题和文章)通过外键附加到目录对象。我想更改表单模型中的queryset以显示附加项,而不是目录名称。我是Django的新手,有没有办法在表单中构造这种类型的queryset?我已经为每个模型添加了默认查询集all

from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, ButtonHolder, Submit
from subscriber.models import Catalog

from . import models

class OrderListForm(forms.ModelForm):


p = Catalog.objects.get()
annuals = forms.ModelChoiceField(queryset=Catalog.objects.all())
issues = forms.ModelChoiceField(queryset=Catalog.objects.all())
articles = forms.ModelChoiceField(queryset=Catalog.objects.all())

class Meta:
    fields = (
                'annuals',
                'issues',
                'articles',)
    model = models.Order


def __init__(self, *args, **kwargs):
    super(OrderListForm, self).__init__(*args, **kwargs)
    self.helper = FormHelper()
    self.helper.layout = Layout(
        'annuals',
                'issues',
                'articles',
        ButtonHolder(
            Submit('create', 'Create')

        )


    )
这是我的模型:

class Catalog(models.Model):
products = models.CharField(max_length=200)

def __unicode__(self):
    return self.products

class Issue(models.Model):
    catalog = models.ForeignKey(Catalog, related_name='issue_products')
    Volume = models.DecimalField(max_digits=3, decimal_places=1)

    def __unicode__(self):
        return unicode(self.catalog)


class Annual(models.Model):
    catalog = models.ForeignKey(Catalog, related_name='annual_products')
    year_id = models.IntegerField(max_length=4)
    start_date = models.CharField(max_length=6)
    end_date = models.CharField(max_length=6)
    def __unicode__(self):
        return unicode(self.year_id)


class Annual_Issue(models.Model):
    annual_id = models.ForeignKey(Annual, related_name='annual_ids')
    issue_id = models.ForeignKey(Issue, related_name='issues')
    def __unicode__(self):
        return self.annual_id


class Article(models.Model):
    catalog = models.ForeignKey(Catalog, related_name='article_products')
    title = models.CharField(max_length=200)
    abstract = models.TextField(max_length=1000, blank=True)
    full_text = models.TextField(blank=True)
    proquest_link = models.CharField(max_length=200, blank=True, null=True)
    ebsco_link = models.CharField(max_length=200, blank=True, null=True)

    def __unicode__(self):
        return self.title


class Order(models.Model):
    user = models.ForeignKey(User, related_name='who_ordered')
    order_lines = models.ForeignKey(Issue, related_name='items_ordered')

您在表单中声明的ModelChoiceFields都使用了不正确的queryset参数。在文档中,您可以看到提供给ModelChoiceForm的queryset应该是一个queryset,字段中的选项将从中填充:

模型对象的查询集,将从中导出字段的选项,并用于验证用户的选择

在您的示例中,您将外键关系的错误端声明为每个ModelChoiceField的查询集。如果将每个ModelChoiceFields更改为使用每个外键关系另一端的对象进行填充,您将看到表单中的ModelChoiceFields现在包括年度、问题和文章

下面是一个为每个字段使用正确查询集的示例

annuals = forms.ModelChoiceField(queryset=Annual.objects.all())
issues = forms.ModelChoiceField(queryset=Issue.objects.all())
articles = forms.ModelChoiceField(queryset=Article.objects.all())
从文档中注意到ModelChoiceField只允许在给定表单中从每个queryset中选择一个对象,这一点很重要。如果希望允许用户从每个查询集中选择多个对象,则可能希望使用


此外,您可以从文档中注意到,queryset中每个对象的选项字段中显示的默认值将是主键。如果希望在“选择”小部件的“选项”中为每个对象显示不同的字段值,则应为ModelChoiceField使用第二个可选参数to_field_name。这是指将在选择选择器中显示的模型字段。

谢谢!谢谢你的解释。由于提交时的某些原因,出现了此错误,无法分配“”:“Order.annuals”必须是“Catalog”实例。自最初的问题以来,您是否更改了订单模型的定义?不,我没有。我认为这与传递的字符串有关,而不是实际的PK关系。这对我来说都是全新的,所以这是我最好的猜测。为了清楚起见,这个问题的原始海报在这个问题之后又提出了关于这个评论流的第二个问题。