【问题标题】:Django ModelForm Template?Django ModelForm 模板?
【发布时间】:2010-02-17 14:11:54
【问题描述】:

我想了解如何将模板添加到我的 ModelForm 我是新手。下面你可以看到我的models.py、url.py和views.py:

我的 model.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”参数是什么?

【问题讨论】:

  • 将所有代码块(甚至最左边的列)缩进四个空格,并在代码块之前/之后留下一个额外的空行。这对我们能够阅读您的代码并帮助您有很大帮助。

标签: python django templates django-forms


【解决方案1】:

在我看来,您的问题出在视图中,您应该这样做:

@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 下添加表单的逻辑。

【讨论】:

    【解决方案2】:

    您实际上可以使用&lt;form action=""&gt;,因为您要发布到的网址与您所在的页面相同。

    如果您不喜欢这样,那么只要您在 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>
    

    【讨论】:

    • 问题中描述的问题似乎与如何渲染他在模板中创建的ModelForm有关,而不是如何将表单的action属性设置为同一端点。
    • “我的问题是关于创建一个表单,表单的“action”参数是什么?” ...这个问题专门询问了表单操作应该是什么
    猜你喜欢
    • 2012-05-24
    • 2015-11-09
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2011-12-27
    • 2015-12-27
    相关资源
    最近更新 更多