标签: django-class-based-views

Django CBV:轻松访问 get_context_data() 中的 url 参数?

据我所知,在自定义方法中访问命名 url 参数的标准方法get_context_data()是通过self.kwargs.

然而,self.kwargs语法变得很尴尬,尤其是在处理大量参数时。因此,我一直在每个方法的顶部采用类似的方法get_context_data()——只是为了获得易于处理的局部变量:

def get_context_data(self, **kwargs):
    var1, var2, var3, var4, var5 = [self.kwargs[x] for x in ['var1', 'var2', 'var3', 'var4', 'var5']]
    # do stuff with var1, var2, ...
    # instead of self.kwargs['var1'], self.kwargs['var2'], ...
Run Code Online (Sandbox Code Playgroud)

这是丑陋且痛苦的,但它最终使事情变得更容易使用和阅读。

有没有一种简单的方法来清理它并将命名参数放入局部变量中?缺少重写get()方法、子类化 Django 的通用视图等?我怀疑我在这里错过了一些非常基本的、基本的 python 概念。

以下是调用的默认get()方法,get_context_data()以防在此处引用有帮助:

def get(self, request, *args, **kwargs):
    context = self.get_context_data(**kwargs)
    return self.render_to_response(context)
Run Code Online (Sandbox Code Playgroud)

更新:

我的错误,调用get()方法实际上如下(FormView在这种情况下泛型正在被子类化)。不幸的是,传入的 kwargsget_context_data()与以下不同self.kwargs

def get(self, request, …
Run Code Online (Sandbox Code Playgroud)

django django-views django-class-based-views

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

CreateView 中的 DatepickerWidget

在我的模型中,我有一个日期字段。所以我想使用日期选择器。如何使用 Django-Admin 日期选择器?

我已经找到了在表单中执行此操作的示例,但我只设计了一个模型。是否可以在我的模型中定义这个小部件?

django jquery-ui-datepicker django-class-based-views

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

Django CBV - 如何避免为每个视图重复 get_context_data 只是为了获得自定义标题?

我正在{{ title }}为我的项目的每一页设置一个。有时这title是一个静态字符串,例如Enter your Name,有时它基于该页面上的相关对象,例如Employee.first_name.

为了创建context['title'],我get_context_data在每个基于类的视图中使用。但这似乎导致我每次都重复一段代码,我希望以某种方式减少它。

例如,要为每个页面编写自定义标题,我必须这样写:

def get_context_data(self, **kwargs):
    context = super(SomeView, self).get_context_data(**kwargs)
    context['title'] = 'Title for This page'
    return context
Run Code Online (Sandbox Code Playgroud)

我觉得有一个混入是理想的,我以某种方式只是传入变量title,我的context字典将context['title']根据传入的变量自动添加。

这可能吗?有没有一种方法来创建一个mixin使得所有我需要做的就是传递一个变量,它会给我一个上下文只是为标题,而不是写出来的代码块的每一个观点?

python django django-class-based-views

5
推荐指数
2
解决办法
636
查看次数

Django 自定义身份验证后端似乎没有被调用?

我在 Python 3 上使用 Django 1.8.4,并尝试创建一个身份验证后端,该后端验证来自旧版 ColdFusion 网站的 cookie,并在检查数据库中的值后创建/登录 Django 用户。在设置中,我包括后端:

AUTHENTICATION_BACKENDS = (
    'site_classroom.cf_auth_backend.ColdFusionBackend',
)
Run Code Online (Sandbox Code Playgroud)

以及后端本身的代码;SiteCFUser 是一个针对 SQL Server 数据库用户模型的模型,其中包含活动 cookie 令牌值:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model
from users.models import SiteCFUser


class ColdFusionBackend(ModelBackend):
    """
    Authenticates and logs in a Django user if they have a valid ColdFusion created cookie.

    ColdFusion sets a cookie called "site_web_auth"
    Example cookie: authenticated@site+username+domain+8E375588B1AAA9A13BE03E401A02BC46
    We verify this cookie in the MS SQL database 'site', table site_users, column user_last_cookie_token
    """

    def authenticate(self, request): …
Run Code Online (Sandbox Code Playgroud)

python django django-models django-authentication django-class-based-views

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

django rest 框架中基于类的视图的自定义装饰器

我的应用程序中很少有用户说 A、B 和 C。一旦任何类型的用户通过身份验证,我都不希望此用户访问我所有的 API

所以对于基于函数的视图,我实现了一个装饰器:

from functools import wraps

from rest_framework import status
from rest_framework.response import Response


def permit(user_type):
    class Permission(object):

        def __init__(self, view_func):
            self.view_func = view_func
            wraps(view_func)(self)

        def __call__(self, request, *args, **kwargs):

            if request.user.user_type in user_type:
                return self.view_func(request, *args, **kwargs)
            else:
                return Response(status=status.HTTP_403_FORBIDDEN)

    return Permission
Run Code Online (Sandbox Code Playgroud)

所以假设我希望我的一个 API 可以访问我所做的一种用户:

@permit(["A"])
def myview(request):
    # return some reponse
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我无法将其转换为基于类的视图。

我试图装饰调度方法:

@method_decorator(permit_only(["A",]))
def dispatch(self, request, *args, **kwargs):
    return super(UserList, self).dispatch(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:

AssertionError(u'.accepted_renderer not set on Response',)
Run Code Online (Sandbox Code Playgroud)

python decorator django-authentication django-class-based-views django-rest-framework

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

URL中的Django Rest必需参数

我正在使用 Django 休息框架。这是我的代码:

网址.py:

urlpatterns = [
    url(r'^users/show', UserShow.as_view()),
]
Run Code Online (Sandbox Code Playgroud)

视图.py:

class UserShow(ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    def get_queryset(self):
        queryset = User.objects.all()
        username = self.request.query_params.get('username', None)
        user_id = self.request.query_params.get('user_id', None)
        if username is not None:
            queryset = queryset.filter(username=username)
        if user_id is not None:
            queryset = queryset.filter(pk=user_id)
        return queryset
Run Code Online (Sandbox Code Playgroud)

我想从这样的 url 获取值: /users/show?user_id=1/users/show?username=mike.

无论是一个user_idusername必须需要的参数。如何在基于类的视图中控制它?

使用我的代码,如果我发送带有错误参数名称的请求/users/show?user111name=mike或简单/users/show的视图当然会响应我queryset = User.objects.all()并列出所有用户。我不需要那个。如果所需参数是None404 响应,我需要。

我可以通过基于函数的视图获得所需的结果:

@api_view(['GET'])
def …
Run Code Online (Sandbox Code Playgroud)

python django django-class-based-views django-rest-framework

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

最初填充 Django-Form 中的 FileField

我有一个描述网页的模型。该source_upload字段代表网页的屏幕截图。

为了将站点对象添加到我的应用程序中,我使用 django 基于类的CreateView. 这确实有效。

现在我正在尝试添加一种半自动添加站点的方式。您可以将 URL 传递给视图,视图会自动填充表单(并生成网页的屏幕截图)。用户应该能够查看所有自动提取的字段 - 特别是自动生成的屏幕截图图像 - 更改它们并点击保存按钮将对象添加到数据库并将图像(如果批准)添加到其最终位置。

get_initial我尝试在视图的方法中实现这一点。除了屏幕截图之外,这效果很好FileField。我设置的路径initial['source_upload']没有显示在current: <link>表单的 FileInput 小部件部分中。

如何为文件字段指定初始值?


模型.py

class Site(models.Model):

    def get_source_upload_path(instance, filename):
        now = datetime.datetime.now()
        return "appname/sites/{}/{}/{}/site_{}_{}".format(now.year, now.month, now.day, instance.pk, filename)

    creationDate = models.DateTimeField(auto_now_add=True)
    last_modifiedDate = models.DateTimeField(auto_now=True)
    creator = models.ForeignKey('auth.User', related_name='siteCreated')
    last_modifier = models.ForeignKey('auth.User', related_name='siteLast_modified')

    date = models.DateTimeField(default=datetime.date.today)    
    title = models.CharField(max_length=240, blank=True)
    body = models.TextField(max_length=3000)

    source_url = models.URLField(blank=True)
    source_upload = models.FileField(upload_to=get_source_upload_path, blank=True)

    keywords = models.ManyToManyField("Keyword")
Run Code Online (Sandbox Code Playgroud)

urls.py

url(r'site/add/$', views.SiteCreate.as_view(), …
Run Code Online (Sandbox Code Playgroud)

python django django-class-based-views

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

带有 GET 参数的基于 Django 类的视图

使用 django 休息框架我试图创建一个允许检索和更新单个用户的视图,但我不明白如何做到这一点。目前我不关心权限和身份验证。

视图.py

class UserDetailsView(RetrieveUpdateAPIView):
    def get_object(self, user_id):
        user = get_user_model().objects.get(pk=user_id)
        return user
Run Code Online (Sandbox Code Playgroud)

urls.py

urlpatterns = [
    #rest of code
    url(r'^user/(?P<user_id>[0-9]+)/$', views.UserDetailsView.as_view(), name="profile"),
]
Run Code Online (Sandbox Code Playgroud)

如果我尝试访问 localhost:8000/user/1 我得到:

TypeError at /user/1/
get_object() missing 1 required positional argument: 'user_id'

Request Method:     GET
Request URL:    http://localhost:8000/user/1/
Django Version:     1.11.1
Exception Type:     TypeError
Exception Value:    

get_object() missing 1 required positional argument: 'user_id'
Run Code Online (Sandbox Code Playgroud)

我错过了一些东西,因为使用基于函数的视图一切都工作得很好。例如:

视图.py

def game(request, id_game):
    # rest of code
Run Code Online (Sandbox Code Playgroud)

urls.py

 url(r'^games/(?P<id_game>[0-9]+)/$', views.game, name="game"),
Run Code Online (Sandbox Code Playgroud)

django django-class-based-views django-rest-framework

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

在使用 Django 的 CreateView 时,如何在保存之前修改表单数据?

我正在使用CreateViewDjango 并且我试图找出如何修改在保存之前发送的任何文本。例如,现在我只想在保存之前将所有文本小写。

我知道我需要使用,form_valid()但我似乎无法正确使用。

表格.py

class ConfigForm(forms.ModelForm):
    class Meta:
        model  = Config
        fields = ["heading", "name", "data", "rating"]
Run Code Online (Sandbox Code Playgroud)

视图.py

def form_valid(self, form):
    super().form_valid(form)
    form.fields["heading"].lower()
    form.fields["name"].lower()
    form.fields["data"].lower()
Run Code Online (Sandbox Code Playgroud)

python django django-class-based-views

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

使用 UserPassesTestMixin(基于类的视图)和重定向

我正在尝试使用基于类的视图,而我最终得到的是默认的 403 Forbidden 页面..mixin 类的顺序是否正确?代码是否甚至在 get/post 中被使用 - 还是所有内容都被绕过并发生默认的 403 重定向?

到目前为止看到的所有工作示例,仅指向基于函数的视图中的装饰器 @login_required 并使用请求对象重定向到登录页面。该文件提供了一些技巧,但我不能得到它与下面的代码工作..把错误堆栈为好。

查看

 "GET / HTTP/1.1" 200 2580
Forbidden (Permission denied): /app/custom-view
Traceback (most recent call last):
  File "C:\Users\me\.envs\project\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\me\.envs\project\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\me\.envs\project\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\me\.envs\project\lib\site-packages\django\views\generic\base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\me\.envs\project\lib\site-packages\django\contrib\auth\mixins.py", line 52, in dispatch
    return super().dispatch(request, *args, …
Run Code Online (Sandbox Code Playgroud)

django django-views django-authentication django-users django-class-based-views

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