2012-06-01 64 views
-1

我views.py:如何通過extra_context中用到 「redirect_to的」 方法在Django蟒蛇

@login_required 
def some_views(request): 
    if request.method == 'POST': 
     form = AddressCreateFrom(request.POST) 
     if form.is_valid(): 
      name = form.cleaned_data['Address'] 
      ip_value = form.cleaned_data['value'] 
      user_list = get_username(name) 
      address_create = form.save() 
      extra_context = { 
       'user_list': user_list 
       } 
      return redirect_to(request, url=address_create.get_absolute_url()) 
    else: 
     form = AddressCreateFrom() 
    extra_context = { 
     'form':AddressCreateFrom(initial={'user': request.user.pk}) 
     } 
    return direct_to_template(request,'networks/user_form.html',extra_context) 

在form.py:

class AddressCreateFrom(forms.ModelForm): 
    Address = forms.CharField(max_length=40) 
    value = forms.CharField(max_length=40) 
    class Meta: 
     model = Network 
     widgets = { 
      'user': forms.HiddenInput() 
      } 

正如你看到的,我使用Djang模型形式兩個額外的Django表單字段,即AddressCreateForm類中的Address and value。在渲染模板時,我需要所有的字段。

事實上some_views方法工作正常,但我也想呈現寫在context_dictionaryuser_list一些額外的數據請求URLaddress_create.get_absolute_url()

如果我沒有錯,如果我們正在處理數據庫,我們必須使用redirect_to方法。有可能這樣做嗎?

+0

你究竟想要做什麼? extra_context應該是什麼意思?爲什麼重定向需要任何類型的任何上下文? –

+0

@DanielRoseman我正在嘗試將網絡模型字段的uesr_list變量(這是一個列表數據類型)傳遞給模板。我在*** Address和ip_value ***字段的基礎上進行了一些計算後得到了這個user_list。如果我這樣做,那麼我不能渲染*** user_list ***變量來模板 –

+0

-1「什麼」。我正在問這個竅門。問題 –

回答

3

一個重定向將返回狀態碼301或302,和位置的HTTP響應重定向到:

301 MOVED PERMANENTLY 
Location: http://www.example.com/new-url/ 

沒有通過原始視圖渲染的模板,所以你不能傳遞到extra_context它。

用戶瀏覽器通常會遵循重定向,並請求新的url。

如果你想顯示關於下一個視圖特定用戶的信息,你必須做一些事情,如:

  1. 設計你的URL模式,包括用戶ID,例如/users/200/,
  2. 包括它作爲獲取參數例如/users/?id=200, then fetch the user id from request.GET`在視圖中。
  3. 在會話中存儲user_id
  4. 在重定向之前,使用用戶數據使用messages framework創建消息。

然後在您重定向到的視圖中,您可以從數據庫中提取用戶,並將其添加到模板上下文中。

1

上下文,額外上下文和POST數據將不會存活重定向。

這是你可以做的。

# before the redirect 
.... 
request.session['user_list'] = user_list 
return redirect_to(request, url=address_create.get_absolute_url()) 

# after the redirect (in the views.py that handles your redirect) 
.... 
user_list = request.session['user_list'] 
extra_context = { 'user_list': user_list } 
.... 
# now you have the user_list in the extra_context and can send it to the rendering engine. 

注:此解決方案僅適用於你自己的服務器內的重定向。