url中的参数无法通过表单读取

时间:2017-05-14 09:19:20

标签: django forms

我正在阅读“django by example”这本书并尝试其中的“书签”示例。对于图像书我很困惑。因为表格无法从django访问参数值。代码如下:

 views.py

from django.shortcuts import render,redirect
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from .forms import ImageCreateForm

@login_required
def image_create(request):
    if request.method == 'POST':
        form = ImageCreateForm(data=request.POST)
        if form.is_valid():   
            cd = form.cleaned_data
            new_item = form.save(commit=False)
            new_item.user = request.user
            new_item.save()
            messages.success(request,'Image added successfully')
            return redirect(new_item.get_absolute_url())
    else:
        form = ImageCreateForm(data=request.POST)
    return render(request,'images/image/create.html',{'section':'images','form':form})

forms.py
from django import forms
from .models import Image
import urllib

from django.core.files.base import ContentFile
from django.utils.text import slugify

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']
        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.rsplit('.',1)[1].lower())
        #response = request.urlopen(image_url)
        response = urllib.urlopen(image_url)
        image.image.save(image_name,ContentFile(response.read()),save=False)
        if commit:
            image.save()
        return image

create.html
{% extends "base.html" %}
{% 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 %}

我使用的网址是 /图像/创建/标题=%20Django%20于是%20Duke&安培;?URL = HTTP%3A%2F%2Fupload。 wikimedia.org%2Fwikipedia%2Fcommons%2F8%2F85%2FDjango_Reinhardt_and_Duke_ Ellington_%28Gottlieb%29.jpg 并且显示的结果是,图片已经显示但仍然说无法找到网址和标题。有人能帮助我吗?谢谢 result

2 个答案:

答案 0 :(得分:0)

从request.method ==&#34; POST&#34;

的if语句中删除表单中的数据参数
form = ImageCreateForm(request.POST)

同样在else语句中,

form = ImageCreateForm()

将csrf标记放在表单变量上方。

这些是编写django视图和模板的推荐方法。

现在form.is_valid()永远不会是真的,即从未执行过代码。

问题可能是两件事。

  1. 在models.py中,模型中的url字段Image应为blank = True,对于发布表单时,url字段可以为空。我没有看到你的models.py,所以我无法对此发表任何意见。
  2. 或者字段网址应该从request.GET.url动态填充。我没有看到任何关于自动填充网址字段的代码,所以可能是问题所在。
  3. 无论哪种方式,错误消息都表明url字段不能在表单中留空。通过执行上述操作之一,可以验证表单,并执行其余代码。

    修改

    根据你的说法,我认为你可能需要在html中手动渲染表单,而不是让django进行表单渲染。 因为,您需要从您的request.GET.url获取网址,然后通过网址字段将其发布到视图中,

    也许是这样的,

    <form method="post">{% csrf_token %}
      <input type="hidden" name="url" id="id_url" value"{{ request.GET.url }}"/>
      <label for="id_title">Title :</label>
      <input type="text" name="title" id="id_title" />
      <label for="id_description">Description</label>
      <input type="text" name="description" id="id_description" />
    </form>
    

    但是,这样做会使您在模型上进行的自定义变得不必要。根据您的需求和您的需求,我认为这是一个更好的选择。 我无法想到更好的解决方案。如果你想出一些比这更好的东西,请随时告诉我..

答案 1 :(得分:0)

在视图的else参数中

编辑 form = ImageCreateForm(request.GET),因为您正在使用get方法解析数据,并且您也在create.html中使用get方法如

<img src = {{ request.GET.url }} >