Django以

时间:2016-08-03 18:38:53

标签: python django django-forms jinja2

tl; dr:如何让表单输出模型中选项的“漂亮”名称?

我有一个带选择的Django模型,定义如下:

class City(models.Model):
    AMSTERDAM = 'AMS'
    ROTTERDAM = 'ROT'
    THE_HAGUE = 'THE'
    UTRECHT = 'UTR'
    CITY_CHOICES = (
        (AMSTERDAM, 'Amsterdam'),
        (ROTTERDAM, 'Rotterdam'),
        (THE_HAGUE, 'The Hague'),
        (UTRECHT, 'Utrecht'),
    )
    name = models.CharField(
        max_length=3,
        choices=CITY_CHOICES,
        default=AMSTERDAM,
        blank=False,
    )

在forms.py中,小部件的定义如下:

class ArticleForm(ModelForm):
    class Meta:
        model = Article
        fields = ['title', 'text', 'categories', 'city']
        widgets = {'title': forms.TextInput(attrs={
            'placeholder': 'Enter a descriptive title'}),
            'text': forms.Textarea(attrs={'placeholder': 'The article'}),
            'categories': forms.CheckboxSelectMultiple(),
            'city': forms.RadioSelect(),
        }

表单本身是手动呈现的(尽管只有{{form}}才会产生相同的效果:

<form action="{% url 'article-submit' %}" method="POST">
    {% csrf_token %}
    {{% for field in form %}
        <fieldset class="article-form__field">
        {% if field.name = "categories"%}
            {{ field.label_tag }}
            <ul id={{ field.auto_id }}>
            {% for checkbox in field %}
                <li>
                    <label for="{{ checkbox.id_for_label }}">
                        {{ checkbox.choice_label }}
                    </label>
                    {{ checkbox.tag }}
                </li>
            {% endfor %}
            </ul>
        {% elif field.name = "city" %}
            {{ field.label_tag }}
            <ul id={{ field.auto_id }}>
            {% for radio in field %}
                <li>
                    <label for="{{ radio.id_for_label }}">
                        {{ radio.choice_label }}
                    </label>
                    {{ radio.tag }}
                </li>
            {% endfor %}
            </ul>
        {% else %}
            {{ field.label_tag }} {{ field }}
        {% endif %}
        </fieldset>
    {% endfor %}}
    <fieldset class="article-form__field">
        <input class="button" type="submit" value="submit">
    </fieldset>
</form>

然而输出不是阿姆斯特丹,而是AMS:

        <fieldset class="article-form__field">

            <label for="city_0">City:</label>
            <ul id=city>

                <li>
                    <label for="city_0">
                        ---------
                    </label>
                    <input checked="checked" id="city_0" name="city" type="radio" value="" />
                </li>

                <li>
                    <label for="city_1">
                        AMS
                    </label>
                    <input id="city_1" name="city" type="radio" value="1" />
                </li>
etc.

在其他模板中,我可以执行此操作:{{city.get_name_display}},以获取全名。我如何在表格中这样做?

full code is here

3 个答案:

答案 0 :(得分:1)

在您的第'city': forms.RadioSelect(),行中,您需要为其定义选项。它应该看起来像:

from blah.models import City

class ArticleForm(ModelForm):
    class Meta:
        model = Article
        fields = ['title', 'text', 'categories', 'city']
        widgets = {'title': forms.TextInput(attrs={
            'placeholder': 'Enter a descriptive title'}),
            'text': forms.Textarea(attrs={'placeholder': 'The article'}),
            'categories': forms.CheckboxSelectMultiple(),
            'city': forms.RadioSelect(choices=City.CITY_CHOICES),
        }

无线电选择小部件继承自选择小部件,该小部件在此处的文档中简要提及了选择参数:https://docs.djangoproject.com/en/1.10/ref/forms/widgets/#django.forms.Select

答案 1 :(得分:1)

我从reddit用户roambe获得了following answer

由于city是外键,Django将使用City模型的__str __(或__unicode__)方法作为选择标签。 这应该使它开始表现得像你想要的那样(如果需要替代unicode):

def __str__(self):
    return self.get_name_display()

答案 2 :(得分:0)

我想稍微扩展一下参数,为继承问题提供一种“解决方法”解决方案。

在我的情况下,返回的值永远不会从“值”更改为“人类-r”。我相信这取决于我的db-django配置:在我的数据库上,字段是FK,而在Django上,字段是简单的CharField。这样,如果不对模型进行更改,就无法为其定义 str 方法。 我决定只有2-3个选择可以覆盖get_status函数,以便评估状态并返回“恒定”输出(简单的IF构造)。