Django ModelForm 模板?
我想学习如何将模板添加到我的ModelForm,因为我还是个新手。下面是我的models.py、url.py和views.py的内容:
我的models.py看起来是这样的:
from django.db import models
from django.forms import ModelForm
from django.contrib.auth.models import User
class Yazilar(models.Model):
yazi = models.CharField(max_length=200)
temsilci = models.ForeignKey(User)
class YaziForm(ModelForm):
class Meta:
model = Yazilar
我的views.py函数如下:
@login_required
def yazi_ekle(request):
yazim = YaziForm
return render_to_response('yazi/save.html', {'YaziForm': YaziForm})
我的url.conf看起来是这样的:
(r'^yazi/save/$', 'tryout.yazi.views.yazi_ekle'),
我想问的是关于创建表单的问题,还有这个表单的“action”参数是什么意思?
2 个回答
其实你可以使用 <form action="">
,因为你要提交的地址和你当前页面是一样的。
如果你不喜欢这样的话,只要在你的 settings.py 文件中的 TEMPLATE_CONTEXT_PROCESSORS 里有 'django.core.context_processors.request',我觉得你也可以这样做:
<form action="{{ request.path }}">
像往常一样,查看文档哦 :)
http://docs.djangoproject.com/en/1.1/ref/request-response/#django.http.HttpRequest.path
编辑
如果在这个问题发布后的一年里,提问者还没有尝试去阅读 ModelForm 的文档... http://docs.djangoproject.com/en/1.2/topics/forms/modelforms/
是的,视图是错的,你需要实例化表单。你还需要一些逻辑来处理提交的数据。如果这是一个编辑视图,你可能还想让视图接受一个项目的 ID,并有一些逻辑来加载那个模型实例。
例如:
@login_required
def yazi_ekle(request, id=None):
form_args = {}
if id is not None:
# edit an existing Yazilar
try:
yazilar = Yazilar.objects.get(pk=id)
except Yazilar.DoesNotExist:
return Http404('Yazilar not found')
form_args['instance'] = yazilar
# else create new Yazilar...
if request.POST:
form_args['data'] = request.POST
yazi_form = YaziForm(**form_args)
if yazi_form.is_valid():
yazilar = yazi_form.save(commit=True)
else:
yazi_form = YaziForm(**form_args)
return render_to_response('yazi/save.html',
{
'yazi_form': yazi_form
},
context_instance=RequestContext(request)
)
然后在你的 urls.py 文件里写类似这样的内容:
(r'^yazi/ekle/(?P<id>\d+)?$', 'tryout.yazi.views.yazi_ekle'),
在模板里:
<form method="post" action="">
{% csrf_token %}<!-- required since Django 1.2 or later -->
<ul>
{{ yazi_form.as_ul }}
</ul>
<input type="submit" value="Submit Form"/>
</form>
我觉得你的问题出在视图上,你应该这样做:
@login_required
def yazi_ekle(request):
yazim = YaziForm() # Look at the (), they are needed for instantiation
return render_to_response('yazi/save.html', {'YaziForm': yazim}) # Sending the form instance to the context, not the form class
现在,在你的模板上下文中有一个叫 YaziForm 的变量。Django 的表单会自动渲染成一堆表格行,里面有默认的控件。所以在你的文件 yazi/save.html 中,做这个:
<form method="post" action="">
{% csrf_token %}
<table>
{{YaziForm}}
</table>
<input type="submit" value="Submit Form"/>
</form>
这样会自动把你的表单渲染成一个表格,不过你还需要在处理 POST 请求时添加一些逻辑。