我有以下Django表单:
class PageForm(forms.Form):
title = forms.CharField(max_length=50)
image = forms.ImageField(required=False)
content = forms.CharField(widget=forms.Textarea(attrs={'cols':20, 'rows':10}))
我正在使用它来创建给定模板的新页面。但是现在我想添加编辑可能性,所以我想使用表单来渲染相同的模板,只有一些默认值从页面ID中重新获得。这就是我所拥有的:
page_to_edit = Page.objects.filter(id=page_id)[0] // Get page from model
title = page_to_edit.title
content = page_to_edit.content
picture = page_to_edit.picture.order_by('?')[0].file // Here file is a models.ImageField
initial_data = {'title' : title, 'content' : content, 'image' : picture}
form = PageForm(initial_data)
// Finally return this form to template
现在这对我想要的标题和内容起作用,并且这些在模板中使用初始值正确呈现,但ImageField只是空的。我也试过传递picture.url而不是图片,但没有变化。
任何帮助都将不胜感激。
一切顺利
答案 0 :(得分:1)
我会按以下方式处理:
.get()
来检索单个记录Page.objects.get(pk=page_id)
,而不是.filter()
,它会返回一个查询集。还有一个shortcut get_object_or_404
采用了一种将.get()
包裹到try..except
块中的常见模式。如果找不到模型,则返回HTTP 404页面。ModelForm
接受现有模型的instance
参数,因此您无需设置初始值。考虑到这些事情,您的代码最终会看起来像这样:
# forms.py
from django import forms
class PageForm(forms.ModelForm):
class Meta:
model = Page
fields = ('title', 'image', 'content')
# views.py
from django.shortcuts import render, get_object_or_404
def edit_page(request, page_id):
page = get_object_or_404(Page, pk=page_id)
if request.method == 'POST':
form = PageForm(instance=page, request.POST)
if form.is_valid():
form.save()
else:
form = PageForm(instance=page)
return render(request, 'some_template.html', {'form': form})
def create_page(request):
if request.method == 'POST':
form = PageForm(request.POST)
if form.is_valid():
form.save()
else:
form = PageForm()
return render(request, 'some_template.html', {'form': form})
# urls.py
(r'^page/create/$', views.create_page, 'create_page'),
(r'^page/edit/(?P<page_id>\d+)/$', views.edit_page, 'edit_page'),