Python 如何让Django';s通用视图是否使用具有初始值的窗体?

Python 如何让Django';s通用视图是否使用具有初始值的窗体?,python,django,forms,Python,Django,Forms,我知道如何从视图中设置窗体的初始值。但是如何让泛型视图为表单设置初始值呢?我可以为泛型视图编写包装器视图,但仍然无法访问表单对象实例化 我试图实现的具体目标是让用户使用create_object通用视图创建一个新对象。但是,我想将对象“user”的字段设置为当前登录的用户,该用户只能作为request.user访问。如何将表单初始化为具有此字段 编辑:我遇到了新的。这个函数可以用一些默认参数调用自己的构造函数吗 非常感谢。不幸的是,您无法通过Django的创建对象通用视图实现此行为;你必须自己写

我知道如何从视图中设置窗体的初始值。但是如何让泛型视图为表单设置初始值呢?我可以为泛型视图编写包装器视图,但仍然无法访问表单对象实例化

我试图实现的具体目标是让用户使用create_object通用视图创建一个新对象。但是,我想将对象“user”的字段设置为当前登录的用户,该用户只能作为request.user访问。如何将表单初始化为具有此字段

编辑:我遇到了新的。这个函数可以用一些默认参数调用自己的构造函数吗


非常感谢。

不幸的是,您无法通过Django的
创建对象
通用视图实现此行为;你必须自己写。然而,这相当简单

首先,必须创建一个新的表单类,如下所示:

from django import forms
class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel  # model has a user field
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.http import HttpResponseRedirect
from django.contrib.auth.decorators import login_required

@login_required
def create_mymodel(request):
    if request.method == 'POST':
        # Get data from form
        form = MyForm(request.POST)
        # If the form is valid, create a new object and redirect to it.
        if form.is_valid():
            newObject = form.save()
            return HttpResponseRedirect(newObject.get_absolute_url())
    else:
        # Fill in the field with the current user by default
        form = MyForm(initial={'user': request.user})
    # Render our template
    return render_to_response('path/to/template.html',
        {'form': form},
        context_instance=RequestContext(request))
然后您可以创建如下视图:

from django import forms
class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel  # model has a user field
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.http import HttpResponseRedirect
from django.contrib.auth.decorators import login_required

@login_required
def create_mymodel(request):
    if request.method == 'POST':
        # Get data from form
        form = MyForm(request.POST)
        # If the form is valid, create a new object and redirect to it.
        if form.is_valid():
            newObject = form.save()
            return HttpResponseRedirect(newObject.get_absolute_url())
    else:
        # Fill in the field with the current user by default
        form = MyForm(initial={'user': request.user})
    # Render our template
    return render_to_response('path/to/template.html',
        {'form': form},
        context_instance=RequestContext(request))

您可以在泛型视图包装器中通过动态构造表单类并将其传递给泛型视图来实现这一点,但这种治疗可能比疾病更糟糕。只需编写自己的视图,并急切地等待着陆。

如果您想要通用视图的所有功能,那么您可以使用原始视图作为模板创建一个新的通用视图

例如:

这是从/site packages/django/views/generic/create_update.py复制的,只有第3行和第21行更改以合并初始数据

然后按照您的预期使用它:

object_info = {
'model': YourModel,
'initial': {'data' : 'Initial Value'},
'template_name': 'template.html'
}

url(r'^path/$',
    login_required(create_object_with_initial),
    object_info,
    name='url_name'),

那应该行。

谢谢。我已经知道了,但是泛型视图太诱人了,它无法处理初始值。我同意:泛型视图很棒,但是如果你想设置默认值,那就是一场噩梦。我完全同意Carl Meyer的观点。我不太明白这篇文章的目的,但是你有没有看过模板名称和额外的内容变量?但是,说真的,为什么不写一个html页面/表单,停止试图想出一些疯狂的通用方法来实现这一点呢。如果您需要在表单中设置某些特定的值(如user),那么您已经在为一个非常特定的情况进行编程了。