【问题标题】:My django form fields are not showing up in template我的 django 表单字段未显示在模板中
【发布时间】:2017-12-15 09:20:53
【问题描述】:

forms.py

class ImageCreateForm(forms.ModelForm):
        class Meta:
            model = Image
            fields = {'title', 'url', 'description'}
            widgets = {
                'url':forms.HiddenInput,
            }


        def clean_url(self):
            url = self.cleaned_data['url']
            valid_extensions = ['jpg', 'jpeg']
            #The two below codes do exactly the same thing but partition is faster
            extention = url.rpartition('.')[2].lower()
            #extension = url.rsplit('.',1)[1].lower()
            if extension not in valid_extensions:
                raise forms.ValidationError('The given URL does not match valid image extensions')
            return url


        def save(self, force_insert=False,force_update=False,commit=True):
            image = super(ImageCreateForm, self).save(commit=False)
            image_url = self.cleaned_data['url']
            image_name = '{}.{}'.format(slugify(image.title), image_url.rpartition('.')[2].lower())
            #download image from the given URL
            response = request.urlopen(image_url)
            image.image.save(image_name,ContentFile(response.read()),save=False)

            if commit:
                image.save()
            return image

图像显示正常,但字段未显示

index.html

    {% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block title %}Bookmark an image{% endblock %}
{% block content %}
<h1>Bookmark an image</h1>
<img src="{{ request.GET.url }}" class="image-preview">
<form action="." method="post">
    {{ forms.as_p }}
    {% csrf_token %}
    <input type="submit" value= 'Bookmark it!'>

</form>
{% endblock %}

【问题讨论】:

  • 您是否在视图中定义了“表单”?
  • 在您的模板中,您有{{ forms.as_p }}。通常,我希望{{ form.as_p }}(没有 s)。你没有展示你的观点,所以我无法判断这是否是问题。
  • 是的,我做了'form = ImageCreateForm(data=request.POST)}'
  • 贴出你的观点代码,方便我们理解
  • 发布你的views.py文件的代码。您在其中呈现带有表单的模板的函数在哪里。我想你忘了定义“表单”所以它没有出现......

标签: python django forms


【解决方案1】:

把你的表格改成这个

您传递list 中的字段而不是set 类型{}

class ImageCreateForm(forms.ModelForm):
        class Meta:
            model = Image
            fields = ['title', 'url', 'description']
            widgets = {
                'url':forms.HiddenInput,
            }

在你看来

def image_create(request):
    if request.method == 'POST':
        #form is sent
        form = ImageCreateForm(request.POST)
        if form.is_valid():
            #form data is valid
            cd = form.cleaned_data
            new_item = form.save(commit=False)

            #assign current user to the item
            new_item.user = request.user 
            new_item.save()
            messages.success(request, 'Image added successfully')

            #redirect to new created item detail view
            return redirect(new_item.get_absolut_url())

    else:
        #build form with data provided by the bookmarklet via GET
        form = ImageCreateForm()

    return render(request, 'images/image/index.html',{'section':'images', 'form':form})

在html中

{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block title %}Bookmark an image{% endblock %}
{% block content %}
<h1>Bookmark an image</h1>
<img src="{{ request.GET.url }}" class="image-preview">
<form action="." method="post">
    {{ form.as_p }}
    {% csrf_token %}
    <input type="submit" value= 'Bookmark it!'>

</form>
{% endblock %}

【讨论】:

  • 在将其传递给 list 后,它仍然只显示图像没有字段
  • 从@ragemon 传递表单的位置发布您的观点
  • @ragemon 您正在将表单传递给 create.html,但您的表单在 index.html 中列出,因此请尝试编辑后的答案,希望对您有所帮助
  • 是的,但我还是有同样的问题
  • 复制视图并将其粘贴到您的视图文件中,它现在可以工作了@ragemon
【解决方案2】:

虽然看起来不像,但要确保if request.method及其相关的else处于同一级别。我有时会缩进 else 以匹配 if form.is_valid 级别。

【讨论】:

    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 2023-01-10
    • 2011-10-11
    • 2021-04-01
    • 2017-05-10
    • 2018-04-07
    • 1970-01-01
    • 2015-08-19
    相关资源
    最近更新 更多