Django Crispy Forms 显示外键的相关值

问题描述 投票:0回答:1

我有一个订单表单,其中显示附加到目录对象的可用项目。目前,它不显示可用的项目,而是仅显示可用的字段名称,而不显示可用的项目。有没有办法以脆皮形式定位目标值?与模板中的完成方式类似:

{% for i in catalog.annual_products.all %}

这是我的表格:

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

class OrderListForm(forms.ModelForm):
    class Meta:
        fields = ('order_lines',)
        model = models.Order



    def __init__(self, *args, **kwargs):
        super(OrderListForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.layout = Layout(
            'order_lines',
            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(Catalog, related_name='items_ordered')

这就是我当前在模板中返回的内容:(这只是目录中产品字段的名称) enter image description here

django django-forms django-crispy-forms
1个回答
0
投票

而不是

fields = ('order_lines',)
,您需要创建一个自定义字段并将其添加到帮助器

from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, ButtonHolder, Submit
from . import models
from django import forms

class OrderListForm(forms.ModelForm):
    order_lines_fk = forms.CharField()
    class Meta:
        model = models.Order



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

            )

        )

在调用

OrderListForm
对象时,您需要传递
order_lines_fk
以及相应的值(可能这将在views.py 文件中)

在模板 html 中你可以使用这个字段

<div>
    {{ form.order_lines_fk|as_crispy_field }}
</div>

如果需要,您可以在模型中创建自定义属性以使其更清晰

class Order(models.Model):
    user = models.ForeignKey(User, related_name='who_ordered')
    order_lines = models.ForeignKey(Catalog, related_name='items_ordered')
    @property
        def order_lines_fk(self):
            return f"{self.order_lines.products}"
© www.soinside.com 2019 - 2024. All rights reserved.