据我所知,在自定义方法中访问命名 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-Admin 日期选择器?
我已经找到了在表单中执行此操作的示例,但我只设计了一个模型。是否可以在我的模型中定义这个小部件?
我正在{{ 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 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
我的应用程序中很少有用户说 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
我正在使用 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_id或username必须需要的参数。如何在基于类的视图中控制它?
使用我的代码,如果我发送带有错误参数名称的请求/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
我有一个描述网页的模型。该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) 使用 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) 我正在使用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) 我正在尝试使用基于类的视图,而我最终得到的是默认的 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