我的应用程序中有很多基于类的视图。其中大多数应该只能由经过身份验证的员工用户访问。如何轻松地为大量基于类的视图添加用户检查?
对于标准函数视图,我添加了这样的装饰器:
def only_staff_allowed(fn):
'''decorator'''
def wrapped(request, *args, **kwargs):
if request.user.is_staff:
return fn(request, *args, **kwargs)
else:
return HttpResponseRedirect(reverse('moderator:login'))
return wrapped
@only_staff_allowed
def dashboard(request):
''' now accessible only by staff users '''
return render(request, 'moderator/dashboard.html', {})
Run Code Online (Sandbox Code Playgroud)
我怎样才能做类似于这样的基于类的视图的事情?
class AddressesAddList(ListView):
template_name = 'moderator/addresses/add_list.html'
queryset = Address.objects.filter(need_moderating=True)
paginate_by = 100
Run Code Online (Sandbox Code Playgroud)
我应该添加一些 mixins 还是覆盖一些方法?或者我可以装饰一些东西吗?
我建立了一个工作正常的listview,并给了我我想要的东西.
在这个ListView的模板中,我声明了一个指向CreateView的表单.表格是这样的,
{% if user.is_authenticated %}
<form action="{% url 'post_wall' %}" method="POST">
{% csrf_token %}
<input type='text' name='body' />
<input type='hidden' name='from_user' value='{{ user.id }}' />
<input type='hidden' name='to_user' value='{{ to_user }}' />
<input type='submit' value='POST'/>
</form>
{% endif %}
Run Code Online (Sandbox Code Playgroud)
post_wall网址对应
url(r'accounts/post_wall', WallCreate.as_view(), name='post_wall'),
Run Code Online (Sandbox Code Playgroud)
包含表单的网址是
url(r'accounts/wall/(?P<slug>\w+)/$', WallList.as_view(), name='wall'),
Run Code Online (Sandbox Code Playgroud)
这会调用CreateView,
class WallCreate(CreateView):
model = WallPost
def get_success_url(self):
url = reverse('wall', kwargs={'slug': request.POST.to_user})
return HttpResponseRedirect(url)
Run Code Online (Sandbox Code Playgroud)
这给了我一个
TemplateDoesNotExist at /accounts/post_wall
users/wallpost_form.html
Run Code Online (Sandbox Code Playgroud)
当帖子被发送到CreateView时,这不应该正常工作吗?或者我误解了有关CBV的事情?
大家好日子!
我的应用程序使用了基于django类的通用列表视图.我有两个模型对象:通过外键链接的图书和发布者(下面的代码).我想使用ListView向发布商展示他们的图书,但过滤图书(只获取当前用户拥有的有效图书)
附加信息:如果可能的话,我不想在模板中使用过滤器.附加信息2:我不能在模型类中使用过滤器,因为我需要访问请求对象
码
models.py
class Publisher(models.Model):
name = models.CharField(max_length=255)
class Book(models.Model):
name = models.CharField(max_length=255)
active = models.BooleanField(default=True)
publisher = models.ForeignKey(Publisher, related_name='books')
owner = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)
views.py
class ListBooksByPublisher(ListView):
model = Publisher
template_name = 'list.html'
context_object_name = 'books'
Run Code Online (Sandbox Code Playgroud)
list.html
{% for publisher in publishers %}
{{ publisher.name }}
{% for book in publisher.books.all %}
{{ book.name }}
{% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
任何帮助非常感谢!
在我的应用中,我希望有一个索引页面,该页面将显示两个对象列表,其中两个列表都包含相同类型的对象(即,相同的Model)。
在传统的基于函数的视图中,这很容易:我定义了两个变量,将它们分配给查询集,然后将它们传递到模板的上下文中,在这里我可以轻松地按名称访问它们。
我还是CBV的新手,似乎有很多魔术,很多东西都是自动处理的。我了解如何覆盖ListView的查询集(默认情况下给定Model的所有对象),但是我没有得到的是如何提供多个查询集,这样我的ListView实际上可以显示两个列表。
到目前为止,我唯一的想法是将self.object_list覆盖为两个查询集的元组,但这似乎会使我的模板代码不太清晰,甚至不确定它是否可以工作。
我正在尝试写一个mixin能够部分保存表单并稍后恢复.当表单很长并且用户无法一次性完成时,这非常有用.mixin下面的代码直接来自Marty Alchin的prodjango书.我已经在误差来自哪个是代码评论POST method在mixin.下面的详细的错误描述.
从追溯,我认为错误来自这两个调用self.get_form(form_class)和get_form_kwargs.但我不知道如何解决这个问题.
这是view:
class ArticleCreateView(PendFormMixin, CreateView):
form_class = ArticleForm
model = Article
template_name = "article_create.html"
success_url = '/admin'
Run Code Online (Sandbox Code Playgroud)
这是mixin:
from django.views.generic.edit import FormView
from pend_form.models import PendedForm, PendedValue
from hashlib import md5
class PendFormMixin(object):
form_hash_name = 'form_hash'
pend_button_name = 'pend'
def get_form_kwargs(self):
"""
Returns a dictionary of arguments to pass into the form instantiation.
If resuming a pended form, this …Run Code Online (Sandbox Code Playgroud) 我正在使用基于类的视图.
class UserCreate(View):
def post(self, request):
data = request.data.get
social_id = data('social_id')
social_source = data('social_source')
user = User(social_id=social_id, social_source=social_source, access_token=access_token)
user.save()
return JsonResponse({'response':200})
Run Code Online (Sandbox Code Playgroud)
它说,每当我在这个URL上发布数据时 CSRF token missing or incorrect.
curl -X POST --header "Content-Type: application/json" --header "Accept: application/json" -d "{
\"social_id\": \"string\",
\"social_source\": \"FB/Gmail\",
\"access_token\": \"string\"
}" "http://127.0.0.1:8000/users/"
Run Code Online (Sandbox Code Playgroud)
我在从函数视图中的表单中获取数据时遇到了这个问题.在那里我曾经在我的视图上添加@csrf_exempt,它会工作.当我将@csrf_exempt添加到我的post方法时,它不起作用.我该如何发布数据?
我有一个基于类的视图,该视图应该根据动物的名称动态选择一种形式。
UpdateAnimalView(FormMixin, DetailView):
def get_form_class(self):
SOME_FORMS = {
"Dog" : "UpdateDogForm",
"Cat" : "UpdateCatForm",
"Frog" : "UpdateFrogForm",
}
animal = object
animal_type = object.type #returns "Dog", "Cat" or "Frog"
form_class_name = SOME_FORMS[animal_type]
#form_class_name now takes the values "UpdateDogForm"
#, "UpdateCatForm" or "UpdateFrogFrom"
return form_class_name
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此命令时,似乎不读form_class而是,string而Django抛出此错误:
'str' object is not callable
追溯来自get_context_data。我推断出调用栈如下:
def get_form(self, form_class=None):
form = super(UpdateAnimalView, self).get_form()
return form
def get_context_data(self, **kwargs):
context = super(UpdateAnimalView, self).get_context_data(**kwargs)
context['form'] = self.get_form()
return context
Run Code Online (Sandbox Code Playgroud)
我该如何返回form_class …
我正在构建一个前端表单,该表单允许某人无需访问管理员即可发布文章。
用户登录后,我希望他/她能够写一篇文章。保存后,我希望将该用户自动设置为文章的作者。
我陷入僵局。任何帮助将非常感激。
models.py
from django.db import models
from django.urls import reverse
from django.contrib.auth.models import User
from django.utils import timezone
class Article(models.Model):
author = models.ForeignKey(User)
title = models.CharField(max_length=65)
text = HTMLField()
created_date = models.DateTimeField(default=timezone.now)
published_date = models.DateTimeField(blank=True, null=True)
def publish(self):
self.published_date = timezone.now()
self.save()
def __str__(self):
return self.title
class ArticleImage(models.Model):
image = CloudinaryField('image')
image_name = models.CharField(max_length=55,
default='')
article = models.ForeignKey(Article)
def __str__(self):
return self.image_name
class ArticleTag(models.Model):
slug = models.SlugField(max_length=50,
unique=True)
article = models.ForeignKey(Article)
def __str__(self):
return self.slug
class ArticleCategory(models.Model):
slug …Run Code Online (Sandbox Code Playgroud) python django modelform inline-formset django-class-based-views
我都有一个CreateView和UpdateView都包含成功消息。但是,只有UpdateView成功消息起作用,而没有显示CreateView消息。为什么会这样呢?
from django.contrib.messages.views import SuccessMessageMixin
class CreateRedirect (CreateView):
model = MarketingRedirect
template_name = 'marketing_redirect/create_redirect.html'
success_url = reverse_lazy('backend_redirect')
fields = ['redirect_from', 'redirect_to']
success_message = "Redirect successfully created!"
class EditRedirect(SuccessMessageMixin, UpdateView):
model = MarketingRedirect
fields = ['redirect_from', 'redirect_to']
template_name = 'marketing_redirect/edit_redirect.html'
context_object_name = 'redirect'
success_url = reverse_lazy('backend_redirect')
success_message = 'Review successfully updated'
Run Code Online (Sandbox Code Playgroud) 我有一个叫的表格MyForm。我否决了这种__init__()方法。现在,我需要request.user在创建此表单时传递参数MyFormView。
我想做这个:
class MyFormView(FormView):
form_class = MyForm(request.user)
Run Code Online (Sandbox Code Playgroud)
我必须重写__init__我的视图方法吗?如果是这样,怎么办?