【问题标题】:Django choicefield using pictures instead of text not displayingDjango选择域使用图片而不是文本不显示
【发布时间】:2018-10-14 12:06:51
【问题描述】:

我正在尝试做一些应该直截了当的事情,但我无法让它正常工作。

我想在一个网格中显示图像,假设每列 4-6 个图像,并且能够选择一个然后点击提交按钮。

我的模型看起来像:

class MyPicture(models.Model):
    name = models.CharField(max_length=60,
                            blank=False,
                            unique=True)
    logo = models.ImageField(upload_to='logos')

    def __str__(self):
        return self.name

我的表格如下:

class MyPictureForm(forms.Form):

    def __init__(self, data, *args, **kwargs):
        super(MyPictureForm, self).__init__(data, *args, **kwargs)
        self.fields['pictures'] = forms.ModelChoiceField(queryset=MyPicture.objects.all())

我的看法是这样的:

def mypicture(request):
    form = MyPictureForm(request.POST or None)

    if form.is_valid():
        #TODO

    return render(request, 'myproj/picture.html', {'form': form})

最后,我的 hmtl(我认为问题出在哪里):

<form action="{% url 'mypicture' %}" method="post">

    {% csrf_token %}
    {% for s in form.pictures %}
        <option value="{{ s.id }}"><img src="{{ MEDIA_URL }}{{ s.logo.url }}"/></option>      
    {% endfor %}


    <input type="submit" value="Submit" class="btn btn-primary"/>

</form>

图片只是不显示。当我在表单中设置断点时,我能够仔细检查图片的地址是否被正确选择。

我确信错误出现在 html 中,但尽管我尝试了很多次,但我还是不知道在哪里。

也许用新的眼光,你会在几秒钟内发现它......希望如此! :)

最佳:

埃里克

【问题讨论】:

  • 后端或javascript控制台中是否有任何错误?
  • @rob 感谢您的帮助。不,我没有收到错误。那是最糟糕的。 :(

标签: html django forms image


【解决方案1】:

您在表单中的何处定义了pictures 字段?还是您的表单是forms.ModelForm 而不是forms.Form? 我认为你应该把它放在__init__ 之外,或者我们可能遗漏了部分代码。

class MyPictureForm(forms.Form):
    pictures = forms.ModelChoiceField(queryset=MyPicture.objects.all())

【讨论】:

  • 感谢您的关注。你的语法不等同于我的__init__吗?我试过你的以防万一,但问题仍然存在。 :S
  • 嗯……你可能是对的。关键是我认为在调用 super __init__ 之前定义字段更干净。所以我会尝试创建一个基于 Select 小部件的新小部件,使用您自己的模板更改 option_template_name&lt;option value="{{ widget.value }}"{% include "django/forms/widgets/attrs.html" %}&gt;&lt;img src="{{ widget.value }}"/&gt;{{ widget.label }}&lt;/option&gt;.
【解决方案2】:

您没有在 HTML 中创建选择元素。

<form action="{% url 'mypicture' %}" method="post">

    {% csrf_token %}
    <select name='picture'>
    {% for s in form.pictures.queryset %}
        <option value="{{ s.id }}"><img src="{{ MEDIA_URL }}{{ s.logo.url }}"/></option>      
    {% endfor %}
    </select>


    <input type="submit" value="Submit" class="btn btn-primary"/>

</form>

【讨论】:

  • 感谢您的帮助。不幸的是,什么都没有显示。好像 s.logo.url 没有被识别。即使做{{s.name}} 也行不通。我得到东西的唯一方法是致电{{s}}。我的印象是选择在传递给 html 之前被转换为字符串,因为这就是为什么我不能通过调用它们的属性来将它们用作对象(例如:logo)。你怎么看?
  • 我认为这正是问题所在。当我显示 html 的源代码时,我得到很多空的&lt;option value=""&gt;&lt;img src=""/&gt;&lt;/option&gt;
  • 您必须遍历图片字段查询集中的所有元素。答案已更新
  • 不幸的是 queryset 在 html 中似乎无法识别,因为循环是空的。如果我放一个断点,它在模板发送到 html 之前的视图中仍然有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 2013-01-23
  • 2021-10-09
相关资源
最近更新 更多