在表单中显示图像

时间:2017-09-16 23:41:04

标签: django django-forms

我有以下表格:

class QuizForm(forms.Form):                                                                                                                                                              
    def __init__(self, *args, **kwargs):
        questions = kwargs.pop('questions')
        super(QuizForm, self).__init__(*args, **kwargs)

        for q in questions:
            answers = [ans.Answer for ans in q['w_answers']]
            answers += [q['question'].CorrectAnswer]

            self.fields['question_%d' % q['question'].id] = \
                forms.ChoiceField(
                    label=q['question'].QuestionText, required=True,
                    choices=[(ans, ans) for ans in answers],
                    widget=forms.RadioSelect)

    def answers(self):
        for name, value in self.cleaned_data.items():
            if name.startswith('question_'):
                yield (name.split('_')[1], value)

此表单的结果基本上是一个问题列表,每个问题都有一些错误的答案和一个正确答案(HTML <ul><ul>内)。

我的一个模型是Question模型:

class Question(models.Model):
    def _image_path(instance, filename):
        return 'images/%s' % filename

    Course = ForeignKey(Course, on_delete=models.CASCADE)
    QuestionText = CharField(max_length=200)
    CorrectAnswer = CharField(max_length=200)
    Image = ImageField(max_length=200, blank=True, null=True,
                       upload_to=_image_path)

    class Meta:
            unique_together = (('Course', 'QuestionText'),)

    def __str__(self):
        return self.QuestionText

正如您所看到的,我的模型中有ImageField,但我不知道如何显示它。

如何显示QuestionTextImage

提前致谢。

修改:模板的相关部分:

<form method="POST" action=".">{% csrf_token %}
    <ul>
        {% for field in form %}
            <li>
                {{ field.errors }}
                {{ field.label_tag }}<br />

                {% if field.Image %}
                    <img src="{{ field.Image }}"><br>
                {% endif %}

                {% for q in field %}
                    {{ q }}<br />
                {% endfor %}<br />
            </li>
        {% endfor %}
    </ul>

    <input type="submit" value="Submit" />
</form>

2 个答案:

答案 0 :(得分:0)

从我看到你可以做一个upload_to='images/',你就可以访问这样的图像:

            {% if field.Image %}
                <img src="{{ field.Image.url }}"><br>
            {% endif %}

请注意,使用小写字母命名字段(图像不是图像等)更好。

此处的实例是一个问题实例,图片是您的字段(我低调),而网址是您的服务图片的路径。

修改 我已经编辑了我的答案,但请再次更改这些档案名称!图像不是图像。

答案 1 :(得分:0)

我没有找到实际的解决方案,所以我试图即兴创作。

最终我想出了将HTML本身作为标签传递:

my_label = q['question'].QuestionText
try:
    my_label += '<br /><img src="' + q['question'].Image.url + '">'
except ValueError:
    pass
my_label = mark_safe(my_label)

self.fields['question_%d' % q['question'].id] = \
    forms.ChoiceField(
        label=my_label, required=True,
        choices=[(ans, ans) for ans in answers],
        widget=forms.RadioSelect)

从模板中删除以下部分:

{% if field.Image %}
    <img src="{{ field.Image }}"><br>
{% endif %}

请随意发布合法的解决方案。