【发布时间】:2015-12-07 02:04:58
【问题描述】:
在官方文档中, formView 是显示表单的视图。出错时,重新显示带有验证错误的表单;成功后,重定向到一个新的 URL。 createView 是一个视图,它显示用于创建对象的表单,重新显示带有验证错误(如果有的话)的表单并保存对象。 //(也许我的英语不够好)所以如果我想为用户创建一个新类别创建一个通用视图,我应该使用 createview 而不是 formview 对吗?我不确定,所以我尝试了两种方法,但它们都给了我同样的错误:as_view() 只需要 1 个参数(给定 2 个)
带表单视图:
用于添加类别
class CategoryFormView(FormView):
form_class = CategoryForm
template_name = 'main/add_category.html'
def get_success_url(self):
return self.request.build_absolute_uri(reverse('category', args=[self.object.slug]))
def get_context_data(self, **kwargs):
context = super(CategoryFormView, self).get_context_data(**kwargs)
# Add any extra context data needed for form here.
return context
使用创建视图
#for adding category
class CategoryCreateView(CreateView):
model = Category
form_class = CategoryForm
template_name = 'main/add_category.html'
def form_valid(self, form):
self.object = form.save(commit=False)
#setting
self.object.save()
return HttpResponseRedirect(reverse('category', args=[self.object.slug]))
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
return super(CategoryCreateView, self).dispatch(request, *args, **kwargs)
最后这是我的 urls.py
url(r'^add_category/', views.CategoryCreateView.as_view, name='add-category'),
编辑:对不起,它可以工作,只是忘记在 url 旁边放括号,但是你能告诉我 createview 和 formview 之间的区别吗?什么时候应该用什么?
编辑2:
def index(request):
categories = Category.objects.order_by('likes')[:5]
latest_posts = Post.objects.all().order_by('-created_at')
popular_posts = Post.objects.all().order_by('-views')
hot_posts = Post.objects.all().order_by('-score')[:25]
context_dict = {
'latest_posts': latest_posts,
'popular_posts': popular_posts,
'hot_posts': hot_posts,
'categories': categories
}
return render(request, 'main/index.html', context_dict)
#for single-post page
#we use uuslug
def post(request, slug):
single_post = get_object_or_404(Post, slug=slug)
single_post.views += 1 # increment the number of views
single_post.save() # and save it
context_dict = {
'single_post' :single_post,
}
return render(request, 'main/post.html', context_dict)
#for category page
#we use slugfield this time
def category(request, category_name_slug):
context_dict = {}
try:
category = Category.objects.get(slug=category_name_slug)
context_dict['category_name'] = category.name
posts = Post.objects.filter(category=category)
context_dict['posts'] = posts
context_dict['category'] = category
except Category.DoesNotExist:
pass
return render(request, 'main/category.html', context_dict)
编辑 3
urls.py
from django.conf.urls import url
from main import views
from django.core.urlresolvers import reverse
from views import *
urlpatterns = [
url(r'^$', IndexView.as_view(), name='index'),
#url(r'^add_post/', views.add_post, name='add_post'),
url(r'^add_post/$', PostCreateView.as_view(), name='post-add'),
url(r'^(?P<slug>[\w|\-]+)/edit/$', PostUpdateView.as_view(), name='post-edit'),
url(r'^(?P<slug>[\w|\-]+)/delete/$', PostDeleteView.as_view(), name='post-delete'),
url(r'^add_category/$', CategoryCreateView.as_view(), name='add-category'),
url(r'^(?P<slug>[\w|\-]+)/$', PostDetailView.as_view(), name='post'),
url(r'^category/(?P<category_name_slug>[\w\-]+)/$', CategoryDetailView.as_view(), name='category'),
]
【问题讨论】:
标签: django