我已经知道如何使用基于类的通用视图之一CreateView,UpdateView和FormView,但我无法弄清楚如何编写干净的东西以创建或更新对象.有人可以帮助我继承其中一个视图和mixins吗?谢谢
我试图使用通用的CreateView类来处理从同一基类继承的一组模型的表单.
class BaseContent(models.Model):
...
class XContent(BaseContent):
...
class YContent(BaseContent):
...
Run Code Online (Sandbox Code Playgroud)
为了保持DRY,我想定义一个CreateView类,它将处理来自BaseContent的所有继承类.
该视图的url模式为:
url(r'^content/add/(?P<model_name>\w+)/$', ContentCreateView.as_view(), name='content_add')
Run Code Online (Sandbox Code Playgroud)
这样的事情应该有效:
class ContentCreateView(CreateView):
template_name = 'content_form.html'
def get_model(self, request):
# 'content' is the name of the application; model_name is 'xcontent', 'ycontent', ...
return ContentType.objects.get_by_natural_key('content', self.model_name)
Run Code Online (Sandbox Code Playgroud)
但是我得到了这个例外:
ContentCreateView is missing a queryset. Define ContentCreateView.model, ContentCreateView.queryset, or override ContentCreateView.get_object().
Run Code Online (Sandbox Code Playgroud)
这个建议似乎并不成立,因为我不愿意设置类属性,model或者queryset保持模型表单生成动态.覆盖get_object它似乎与创建对象无关.
我试过覆盖get_queryset()但是这个方法不接受request参数,也没有self.model_name来自url模式的访问权限.
长话短说,如何让CreateView使用基于从url传递的参数的动态表单?
谢谢.
我是Django的新手(从1.3开始).在构建应用程序时,我从第一天开始使用新的基于类的通用视图,使用内置类的组合并将它们子类化为我需要添加到上下文的位置.
现在我的问题是,我需要回到我的观点,并且只有登录用户才能访问它们.我找到的所有文档都显示了如何使用旧的功能通用视图执行此操作,而不是基于类.
这是一个示例类:
class ListDetailView(DetailView):
context_object_name = "list"
def get_queryset(self):
list = get_object_or_404(List, id__iexact=self.kwargs['pk'])
return List.objects.all()
def get_context_data(self, **kwargs):
context = super(ListDetailView, self).get_context_data(**kwargs)
context['subscriber_list'] = Subscriber.objects.filter(lists=self.kwargs['pk'])
return context
Run Code Online (Sandbox Code Playgroud)
如何为django的基于类的新视图添加身份验证?
像Django中关于通用视图的大量文档一样,我找不到明确描述如何使用Django Forms的新的基于类的通用视图的文档.
怎么做?
django django-forms django-views django-generic-views django-class-based-views
根据django文档,viewname是函数名称或url模式名称.但是反转这个'反向(MyView.as_view())'的网址会变成NoReverseMatch异常.有没有办法按功能名称反转基于类的视图?
例如,我有一个基于类的视图,它允许GET和POST方法,如下所示,
class ViewOne(View):
def post(self, request, *args, **kwargs):
...
def get(self, request, *args, **kwargs):
...
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(ViewOne, self).dispatch(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
现在,GET和POST都是login_required.但是,如果我只想要POST为login_required怎么办?
在我的CreateView班级中,我将覆盖以下form_valid()函数:
class ActionCreateView(CreateView):
model = Action
form_class = ActionCreateForm
success_url = reverse_lazy('profile')
def get_initial(self):
initial = super(ActionCreateView, self).get_initial()
initial['request'] = self.request
return initial
def form_valid(self, form):
form.instance.user = self.request.user
print 'user: %s'%form.instance.user
try:
da = form.cleaned_data['deadline_date']
ti = datetime.now()
form.instance.deadline = datetime(da.year, da.month, da.day, ti.hour, ti.minute, ti.second )
except Exception:
raise Http404
return super(ActionCreateView, self).form_valid(form)
Run Code Online (Sandbox Code Playgroud)
但事实证明,该form_valid方法永远不会被调用,因为user它永远不会打印出来.有趣的clean是,调用forms.py中的方法.
没有显示错误(因此我没有要显示的回溯).用户只是重新定向到表单. 这种行为可能是什么原因? 我正在使用Django 1.5和Python 2.7.
django validation django-class-based-views class-based-views django-1.5
我正在练习Django的FormViews.
在这个应用程序中,我正在创建一个创建博客帖子的PostCreate视图.
这是我的代码:
models.py
class Post(models.Model):
user = models.ForeignKey(User)
post_title = models.CharField(max_length=200)
post_content = models.CharField(max_length=500)
class Tag(models.Model):
name = models.CharField(max_length=64, unique=True)
posts = models.ManyToManyField(Post)
Run Code Online (Sandbox Code Playgroud)
forms.py
class PostForm(forms.ModelForm):
post_title = forms.CharField(
label=u'Title',
widget=forms.TextInput(attrs={'size':64})
)
post_content = forms.CharField(
label=u'Content',
widget=forms.TextInput(attrs={'size':128})
)
tags = forms.CharField(
label=u'Tags',
required=True,
widget=forms.TextInput(attrs={'size':64})
)
class Meta:
model = Post
exclude = ('user', 'post_date')
Run Code Online (Sandbox Code Playgroud)
views.py
class PostCreate(CreateView):
template_name = 'app_blog/post_save_form.html'
model = Post
form_class = PostForm
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.user = self.request.user
tag_names = form.cleaned_data['tags'].split()
for …Run Code Online (Sandbox Code Playgroud) 我的项目中有内部帐户隐私权限(例如,只有朋友可以看到用户的个人资料页面),我希望在这种情况下拥有自定义权限被拒绝页面.有没有办法从TemplateView返回状态代码等于403的响应?
像这样的东西:
class PrivacyDeniedView(TempateView):
template_name = '...'
status_code = 403
Run Code Online (Sandbox Code Playgroud)
我可以通过覆盖dispatch()来做到这一点,但也许Django有开箱即用的解决方案
答:看起来没有通用的解决方案.最好的方法是由@alecxe提出,但是在@FoxMaSk建议中封装在Mixin中
题:
我正在尝试访问中间件层中的视图实例的属性.
例如,给定一个基于类的视图,如下所示:
# views.py
class MyView(View):
my_attribute = 'something'
Run Code Online (Sandbox Code Playgroud)
我希望能够my_attribute通过这样的方式处理中间件:
# middleware.py
def process_view(self, request, view_func, view_args, view_kwargs):
my_attribute = request.view.my_attribute
Run Code Online (Sandbox Code Playgroud)
当然,这不起作用,因为Django不会通过请求对象公开视图实例.有没有办法实现这一目标?
谢谢!
我的第一次尝试:
我最初认为该process_view()方法可能是一个很好的地方.不幸的是,view_func它接收的参数包含一个函数 - 输出MyView.as_view()- 而不是视图实例本身.来自Django文档:
process_view(self,request,view_func,view_args,view_kwargs)
... view_func是Django即将使用的Python函数.(它是实际的函数对象,而不是函数的名称作为字符串.)...
我的第二次尝试:
process_template_response()方法中提供了视图实例的句柄,但它非常笨拙,而且,无论如何,我希望能够my_attribute在中间件堆栈的早期阶段使用它.但这确实有效:
def process_template_response(self, request, response):
my_attribute = response.context_data['view'].my_attribute
Run Code Online (Sandbox Code Playgroud) django ×10
django-views ×3
django-1.3 ×1
django-1.5 ×1
django-forms ×1
python ×1
validation ×1