我正在使用基于視圖類來更新我的應用程式中名為article 的文章。我正在實作它,就像UpdateView 的作業方式一樣,但是我似乎無法在驗證表單后使其重定向。我呼叫了success_url方法重定向到詳細資訊視圖,但它不起作用。我錯過了什么嗎?
我在模型中設定了get_absolute_url,
#models.py
class Article(models.Model):
def get_absolute_url(self):
return reverse('articles:article-detail', kwargs={"id": self.id})
并在網址中
#urls.py
app_name = 'articles'
urlpatterns = [
path('<int:id>/edit/', ArticleUpdateView.as_view(), name='article-edit'),
path('<int:id>/', ArticleDetailView.as_view(), name='article-detail'),
]
和觀點:
#views.py
class ArticleUpdateView(View):
template_name = 'articles/article_edit.html'
def get_success_url(self):
id = self.kwargs.get('id')
return reverse('articles:article-detail', kwargs={'id': id})
def get_object(self):
id = self.kwargs.get('id')
obj = None
if id is not None:
obj = get_object_or_404(Article, id=id)
return obj
def get(self, request, id=None, *args, **kwargs):
context = {}
obj = self.get_object()
if obj is not None:
form = ArticleModelForm(instance=obj)
context['article'] = obj
context['form'] = form
return render(request, self.template_name, context)
def post(self, request, id=None, *args, **kwargs):
context = {}
obj = self.get_object()
if obj is not None:
form = ArticleModelForm(request.POST, instance=obj)
if form.is_valid():
form.save()
context['article'] = obj
context['form'] = form
return render(request, self.template_name, context)
我嘗試在 UpdateView 類上使用它,重定向似乎作業正常,我想在基于視圖的類上使用它。
uj5u.com熱心網友回復:
django 基視圖類不會get_success_url()自動呼叫類似的東西,這是添加到基于通用類的視圖的功能中的東西,就像UpdateView它繼承的另一個類一樣。如果您想在基本視圖中重定向,那么您將需要實際進行重定向呼叫。
在您的 views.py 檔案中,您可以匯入from django.http import HttpResponseRedirect,然后在您if form.isvalid():的視圖中的陳述句中添加行return HttpResponseRedirect(self.get_success_url())。只是呼叫get_success_url()本身對您如何定義它沒有任何作用,因為reverse()快捷方式只是根據您傳遞給函式的名稱和引數生成 url。
uj5u.com熱心網友回復:
Chack這個,首先你需要匯入reverse_lazy
class ArticleUpdateView(UpdateView):
.....
def get_success_url(self):
return reverse_lazy('article-detail', kwargs={'pk': self.object.pk})
uj5u.com熱心網友回復:
如果您使用的是表單,您可以通過為表單設定 pull 或 get 方法來進行重定向,并將操作值設定為您想直接在 html 模板中重定向的 url。這是一個例子:
<form id="contactForm" name="updateArticle" action="{% url 'article-detail' %}" method="post">
{% csrf_token %}
{% for field in form %}
/* Your code */
{% endfor %}
<button type="submit">Update Post</button>
</form>
然后在您的ArticleDetailView 中,您可以設定 post() 方法來呈現詳細資訊頁面:
class ArticleDetailsView(View):
template_name = 'articles/article_details.html'
post(self, request, *args, **kwargs):
# Your code
return render(request, self.template_name, context)
您還可以使用redirect() 方法代替render()。您可以在此處找到檔案。
uj5u.com熱心網友回復:
from django.views.generic.edit import FormMixin
class ArticleUpdateView(View, FormMixin):
...
FormMixin 包含你尋求的魔法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/365354.html
