2009-05-25 32 views
2

我知道如何將初始值設置爲視圖中的表單。但我怎麼去讓通用視圖設置初始值的形式?我可以爲通用視圖編寫一個包裝視圖,但我仍然無法訪問表單對象實例。如何讓Django的通用視圖使用具有初始值的表單?

我試圖實現的具體目標是讓用戶使用create_object通用視圖創建一個新對象。但是,我想將對象'us​​er'的字段設置爲當前登錄的用戶,該用戶只能以request.user身份訪問。如何將表單初始化爲具有此字段?

編輯:我碰到__new__。這可以用一些默認參數調用它自己的構造函數嗎?

非常感謝。

+0

我真的不明白這個的目的,但你看看template_name和extra_content變量嗎? 但嚴重的是,爲什麼不寫一個HTML頁面/表單,並停止嘗試拿出這樣做的通用方法瘋狂。如果你需要在表單中設置一些特定的值(比如用戶),你已經編寫了一個非常具體的案例。 – drozzy 2009-05-26 16:53:36

回答

4

不幸的是,你不能通過Django的create_object通用視圖來實現這種行爲;你將不得不寫你自己的。但是,這很簡單。

要開始了,你必須創建一個新的窗體類,像這樣:

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)) 
+0

謝謝。我已經知道這一點,但通用的觀點非常誘人,它不能用初始值。 – 2009-05-25 22:03:18

3

你可以在做到這一點一個通用的視圖包裝器通過動態構建一個表單類並將其傳遞給通用視圖,但是這種治療可能比疾病更糟糕。只要寫下你自己的看法,然後熱切地等待this降落。

0

如果您需要通用視圖的所有功能,那麼您可以使用原始模板創建新的通用視圖。

例如:

def create_object_with_initial(request, model=None, template_name=None, 
    template_loader=loader, extra_context=None, post_save_redirect=None, 
    login_required=False, context_processors=None, form_class=None, initial=None): 

if extra_context is None: extra_context = {} 
if login_required and not request.user.is_authenticated(): 
    return redirect_to_login(request.path) 

model, form_class = get_model_and_form_class(model, form_class) 
if request.method == 'POST': 
    form = form_class(request.POST, request.FILES) 
    if form.is_valid(): 
     new_object = form.save() 

     msg = ugettext("The %(verbose_name)s was created successfully.") %\ 
           {"verbose_name": model._meta.verbose_name} 
     messages.success(request, msg, fail_silently=True) 
     return redirect(post_save_redirect, new_object) 
else: 
    print "creating", form_class, " with initial data ", initial 
    form = form_class(initial=initial) 

# Create the template, context, response 
if not template_name: 
    template_name = "%s/%s_form.html" % (model._meta.app_label, model._meta.object_name.lower()) 
t = template_loader.get_template(template_name) 
c = RequestContext(request, { 
    'form': form, 
}, context_processors) 
apply_extra_context(extra_context, c) 
return HttpResponse(t.render(c)) 

這是從/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'), 

這應該工作。

相關問題