我正在阅读“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
答案 0 :(得分:0)
从request.method ==&#34; POST&#34;
的if语句中删除表单中的数据参数form = ImageCreateForm(request.POST)
同样在else语句中,
form = ImageCreateForm()
将csrf标记放在表单变量上方。
这些是编写django视图和模板的推荐方法。
现在form.is_valid()永远不会是真的,即从未执行过代码。
问题可能是两件事。
无论哪种方式,错误消息都表明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)
编辑 form = ImageCreateForm(request.GET),因为您正在使用get方法解析数据,并且您也在create.html中使用get方法如
<img src = {{ request.GET.url }} >