标签: django-class-based-views

django 为基于类的视图添加用户身份验证检查

我的应用程序中有很多基于类的视图。其中大多数应该只能由经过身份验证的员工用户访问。如何轻松地为大量基于类的视图添加用户检查?

对于标准函数视图,我添加了这样的装饰器:

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 还是覆盖一些方法?或者我可以装饰一些东西吗?

django django-class-based-views

1
推荐指数
1
解决办法
3252
查看次数

是否可以在ListView模板中使用表单?

我建立了一个工作正常的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 django-class-based-views class-based-views

1
推荐指数
1
解决办法
2524
查看次数

Django在基于类的通用列表视图中过滤子对象

大家好日子!

我的应用程序使用了基于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)

任何帮助非常感谢!

django foreign-key-relationship django-class-based-views

1
推荐指数
1
解决办法
4262
查看次数

如何在Django CBV ListView中具有多个列表?

在我的应用中,我希望有一个索引页面,该页面将显示两个对象列表,其中两个列表都包含相同类型的对象(即,相同的Model)。

在传统的基于函数的视图中,这很容易:我定义了两个变量,将它们分配给查询集,然后将它们传递到模板的上下文中,在这里我可以轻松地按名称访问它们。

我还是CBV的新手,似乎有很多魔术,很多东西都是自动处理的。我了解如何覆盖ListView的查询集(默认情况下给定Model的所有对象),但是我没有得到的是如何提供多个查询集,这样我的ListView实际上可以显示两个列表。

到目前为止,我唯一的想法是将self.object_list覆盖为两个查询集的元组,但这似乎会使我的模板代码不太清晰,甚至不确定它是否可以工作。

django django-class-based-views

1
推荐指数
1
解决办法
1804
查看次数

AttributeError:myview在Django中的自定义mixin中没有属性对象

我正在尝试写一个mixin能够部分保存表单并稍后恢复.当表单很长并且用户无法一次性完成时,这非常有用.mixin下面的代码直接来自Marty Alchin的prodjango书.我已经在误差来自哪个是代码评论POST methodmixin.下面的详细的错误描述.

从追溯,我认为错误来自这两个调用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)

django mixins django-generic-views django-class-based-views

1
推荐指数
1
解决办法
3729
查看次数

Django CSRF Verifcation失败 - 基于类的视图

我正在使用基于类的视图.

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方法时,它不起作用.我该如何发布数据?

django django-csrf django-class-based-views

1
推荐指数
2
解决办法
3416
查看次数

重写Django的get_form_class()方法会引发字符串错误

我有一个基于类的视图,该视图应该根据动物的名称动态选择一种形式。

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 …

python django django-class-based-views

1
推荐指数
1
解决办法
937
查看次数

使用createview和modelform在django中自动将登录用户设置为作者

我正在构建一个前端表单,该表单允许某人无需访问管理员即可发布文章。

用户登录后,我希望他/她能够写一篇文章。保存后,我希望将该用户自动设置为文章的作者。

我陷入僵局。任何帮助将非常感激。

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

1
推荐指数
1
解决办法
2436
查看次数

Django CreateView成功消息未显示

我都有一个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)

python django django-class-based-views

1
推荐指数
1
解决办法
2227
查看次数

在FormView Django中将参数传递给表单

我有一个叫的表格MyForm。我否决了这种__init__()方法。现在,我需要request.user在创建此表单时传递参数MyFormView

我想做这个:

class MyFormView(FormView):
    form_class = MyForm(request.user)
Run Code Online (Sandbox Code Playgroud)

我必须重写__init__我的视图方法吗?如果是这样,怎么办?

python django django-forms django-class-based-views

1
推荐指数
1
解决办法
660
查看次数