【问题标题】:Django pass variables to form_classDjango 将变量传递给 form_class
【发布时间】:2017-11-16 22:52:35
【问题描述】:

我正在试图弄清楚如何从一个模型中访问字段,该模型用作表单正在查询的模型中的 ForeignKey。

每个Room 都有一个表单,用户可以在其中从可能的Layout 对象的动态列表中选择一个Layout

1—HTML forms/room/update/layouts.html

<form class="layouts__form form-horizontal" action="" method="post" enctype="multipart/form-data">

    <fieldset class="form__options">

        {% csrf_token %}
        {% for field in form.layout %}
            <div class="layouts__layout"> 
                {{ field.tag }}

                {{ field.choice_label }}

                <label for="value_{{ forloop.counter0 }}">
                    <div class="layouts__layout__thumbnail layouts__layout__thumbnail--{{ field.choice_label }}" style="background-image: url('### (I WOULD LIKE TO LOAD 'Layout.thumbnail' HERE) ###');"></div>
                </label>
            </div>
        {% endfor %}
        <div class="form__submit">
            <button type="submit">Submit</button>
        </div>

    </fieldset>

</form>

2—views.py 中的 this 正在调用表单:

class RoomLayoutView(UpdateView):
    model = Room
    form_class = RoomLayoutForm
    template_name = 'forms/room/update/layouts.html'

3 - 这是由 forms.py 中的 this 创建的:

class RoomLayoutForm(forms.ModelForm):
    layout = forms.ModelChoiceField(
             widget=forms.RadioSelect(attrs={'type': 'radio', 'id': 'value',}),
             queryset=Layout.objects.all(),
             required=False, empty_label=None)

    class Meta:
        model = Room
        fields = ['layout']

4 - 使用 Room 模型来自:

class Room(models.Model):
    title = models.CharField(max_length=200, blank=True)
    layout = models.ForeignKey(Layout, related_name='template_selected', blank=True, null=True)

    def __str__(self):
        return self.title

5 - 将 Layout 模型之一作为此处定义的 ForeignKey:

class Layout(models.Model):
    title = models.CharField(max_length=200)
    ...
    padding_top = models.IntegerField(blank=False, default=0)
    ...
    thumbnail = models.FileField(upload_to='layouts')
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ('-title',)

    def __str__(self):
        return self.title

我试图弄清楚如何在实际表单中从Layout 模型访问属性。我特别想在顶部的表单中动态加载Layout.thumbnailLayout.padding_top。我已经尝试了至少 8 种不同的方法,但无法找到一种方法来完成这项工作。任何帮助将不胜感激。

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    this answer 中所述,您可以在模板中访问与表单关联的当前实例,如下所示:

    {{ form.instance }}
    

    所以要访问链接的layoutthumbnailpadding_top 属性:

    {{ form.instance.layout.thumbnail }}
    {{ form.instance.layout.padding_top }}
    

    【讨论】:

    • 感谢您的回复。 {{ form.instance.layout.thumbnail }} 的问题在于它为表单的所有结果拉取选定的缩略图,而不是每个字段的缩略图。你知道有什么方法可以访问每个选项的变量吗?
    • 我看不到从表单中访问相关模型属性(除了选项标签/值)的方法。我认为您应该将 Layout 实例列表 (Layout.objects.all()) 添加到模板的上下文中并在那里访问它们的属性。或者,您可能还想查看django-select-2 以呈现丰富的小部件...
    猜你喜欢
    • 2019-03-24
    • 1970-01-01
    • 2019-04-03
    • 2012-02-15
    • 2020-12-14
    • 1970-01-01
    • 2013-01-25
    • 2021-10-12
    相关资源
    最近更新 更多