2016-01-24 40 views
0

我想將用戶重定向到他們在提交後創建的最新文章。Django重定向到最新創建的文章

該網址不使用身份證,但slu how我怎麼能做到這一點?我當時就想,這樣的事情:

views.py

def article_id(request, slug): 
    context = {'article_id': get_object_or_404(Article, slug=slug)} 
    return render(request, 'article_id.html', context) 


@login_required(login_url='/user') 
def article_ajouter(request): 
    if request.method == 'POST': 
     form = ArticleForm(request.POST, request.FILES) 

     if form.is_valid(): 
      save_it = form.save() 
      save_it.user = request.user 
      save_it.save() 
      object = Article.objects.get(article_id) 
      redirect(object, permanent=True) #I don't know if I am completely mistaken. 
    else: 
     form = ArticleForm() 

    context = {'form':form} 
    return render(request, 'article_ajouter.html', context) 

爲了做到這一點重定向有什麼建議?

---- ---- UPDATE

文/ urls.py

url(r'^(?P<slug>[-\w\d]+)/$', views.article_id, name="article_detail"), 

文/ views.py

if form.is_valid(): 
    save_it = form.save() 
    save_it.user = request.user 
    save_it.save() 
    return redirect('article_detail', article_id=save_it.slug) 

回答

2

你不必定義了一個名爲article_id的局部變量,所以此代碼將失敗,因爲它會嘗試將該名稱的視圖傳遞給Article.objects.get(),根本沒有意義。

但是沒有必要做任何查詢; save_it已經是你想要的文章了。如果文章類定義了一個get_absolute_url,那麼這個代碼將起作用(有一個變化,見下文);如果不是,那麼您需要在重定向呼叫中使用URL模式名稱。

最後的變化是你需要實際上返回的重定向,就像你返回任何其他類型的響應一樣。

因此,假設你定義爲您的article_id視圖中的URL看起來像這樣:

url(r'^articles/(?P<slug>\w+)/$', article_id, name='article_detail'), 

那麼你可以這樣做:

return redirect('article_detail', slug=save_it.slug) 

(我還指出, 「article_id的」是一個視圖一個陌生的名字;它可能要被稱爲「article_detail」反正)

+0

我試過了,但是我正在爲這個錯誤信息'Reverse for'article_detail'帶有參數'()'和關鍵字參數'{'article_id':'test-article-two'}'找不到。 1個模式嘗試:['article /(?P [ - \\ w \\ d] +)/ $']'爲什麼是這樣?我爲我的帖子添加了更新,以瞭解我是如何做到的。 – Lindow

+0

發現它,像這樣返回重定向('http://.../article/'+ str(save_it.slug))'',但想知道是否有一種方法,我不應該添加url如果我更改域名,我不想更改所有網址。 – Lindow

+0

對不起,用slug代替article_id,我已經更正了答案。 –

0
from django.core.urlresolvers import reverse 
from django.http import HttpResponseRedirect 

def article_id(request, slug): 
    article_id = Article.objects.get(slug__iexact=slug) 
    context = {'article_id': article_id} 
    return render(request, 'article_id.html', context) 


@login_required(login_url='/user') 
def article_ajouter(request): 
    if request.method == 'POST': 
     form = ArticleForm(request.POST, request.FILES) 

     if form.is_valid(): 
      save_it = form.save(commit=False) 
      save_it.user = request.user 
      save_it.save() 
      return HttpResponseRedirect(reverse('article_detail', args=(save_it.slug,))) 
    else: 
     form = ArticleForm() 

    context = {'form':form} 
    return render(request, 'article_ajouter.html', context) 

氏。 s將是你的網址

url(r'^articles/(?P<slug>[\w-]+)/$', views.article_id, name='article_detail'), 

這應該讓它工作,如果任何其他錯誤。請通知