我有一个QuestionView派生自FormView班级的班级.这是一个代码片段来解释我的问题:
class QuestionView(FormView):
...
context_var1 = y
def form_valid (self, form):
...
self.context_var1 = x
...
def get_context_data(self, **kwargs):
...
context['context_var1'] = self.context_var1
...
return context
Run Code Online (Sandbox Code Playgroud)
如上所示,我更新了一组上下文变量form_valid,我打算在模板中使用这些变量的值 - 因此是context字典中的变量.这段代码的问题context_var1在于没有看到更改
- 可能是因为get_context_data在form_valid方法之前调用了.这有解决方法吗?
我已经搜索了基于类的视图Django文档(Django 1.4)的参考和主题,但我还没有发现任何提及此问题.如何使用基于类的视图动态设置模板名称?我正在寻找以下设置的基于类的等价物:
urls.py
from django.conf.urls.defaults import *
from mysite.views import dynamic
urlspatterns = patterns('',
url(r'^dynamic/(?P<template>\w+)/$', dynamic),)
)
Run Code Online (Sandbox Code Playgroud)
views.py
from django.shortcuts import render_to_response
def dynamic(request, template):
template_name = "%s.html" % template
return render_to_response(template_name, {})
Run Code Online (Sandbox Code Playgroud) 我正在为项目使用Django 1.3的基于类的通用视图.他们真的很好,但我想成为DRYer.我有一个页面显示我们收到的新闻报道列表,另一个页面显示我们发布的文章列表.在概述页面上,我需要显示两个列表.我想创建一个复合视图,它接受两个视图并创建一个附加了两个查询集的上下文.
在Django中为"基于类"的通用视图添加"取消"按钮的最佳方法是什么?
在下面的示例中,我希望取消按钮将您带到success_url不删除对象.我试过<input type="submit" name="cancel" value="Cancel" />在模板上添加一个按钮.我可以通过覆盖类的post方法来检测是否按下了这个按钮AuthorDelete,但我无法弄清楚如何从那里重定向.
示例myapp/views.py:
from django.views.generic.edit import DeleteView
from django.core.urlresolvers import reverse_lazy
from myapp.models import Author
class AuthorDelete(DeleteView):
model = Author
success_url = reverse_lazy('author-list')
def post(self, request, *args, **kwargs):
if request.POST["cancel"]:
return ### return what? Can I redirect from here?
else:
return super(AuthorDelete, self).post(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
示例myapp/author_confirm_delete.html:
<form action="" method="post">{% csrf_token %}
<p>Are you sure you want to delete "{{ object }}"?</p>
<input type="submit" value="Confirm" />
<input type="submit" name="cancel" value="Cancel" /> …Run Code Online (Sandbox Code Playgroud) 嗨Stackoverflow人,
在forms.py中的clean函数中,我想在会话变量中自动保存一些信息.但是,我似乎无法访问请求变量.
切换请求变量的所有示例都基于基于函数的视图,但在这里我使用的是基于类的视图.
我的forms.py:
from django import forms
from item.models import Item
class CreateItemForm(forms.ModelForm):
class Meta:
model = Item
fields = ('name', 'description')
def __init__(self, request, *args, **kwargs):
self.request = request
super(CreateItemForm, self).__init__(*args, **kwargs)
def clean(self):
cleaned_data = super(CreateItemForm, self).clean()
if cleaned_data.get("address"):
self.request.session['name'] = cleaned_data.get("name")
else:
raise forms.ValidationError(_('Oops, can\'t find location.'))
return self.cleaned_data
Run Code Online (Sandbox Code Playgroud)
我的views.py:
from django.views.generic.edit import FormView
from item.forms import CreateItemForm
class ItemCreate(FormView):
form_class = CreateItemForm
template_name = 'item/item_create.html'
success_url = 'http://www.google.com'
Run Code Online (Sandbox Code Playgroud)
request将views.py中的变量移交给forms.py 的最佳方法是什么?
谢谢您的回答.
是否有可能pk从与网址相关的消除UpdateView?
例如,如果我有
url(r'^myobj/update/(?P<pk>\d+)/$', views.UpdateMyObj.as_view(), name="update")
Run Code Online (Sandbox Code Playgroud)
有什么方法可以写它
url(r'^myobj/update/$', views.UpdateMyObj.as_view(), name="update")
Run Code Online (Sandbox Code Playgroud)
然后pk作为参数发送POST或GET请求?
我正在使用django为我的团队组建一个项目管理网站.我的基本模板包括一个侧边栏菜单,其中包含所有项目和用户的列表DetailView,分别链接到该用户或项目的a .
我的问题是我需要为每个视图提供User和Project模型,以便我可以渲染该侧边栏.我知道如何添加额外的上下文 ; 问题是我觉得我通过修改每个级别的上下文来违反DRY.是否有可能重新定义简单的底座TemplateClass,使所有儿童类- ListView,DetailView等,含有改性方面?
在相关的说明中,如果这是设置项目的可怕方式,请告诉我.
我是Django Class视图的新手.我正在尝试制作一个简单的视图来获取帖子的详细信息.我的views.py:
from django.views.generic import ListView, View, DetailView
class GenreDetail(DetailView):
model = Post
template_name = "post.html"
Run Code Online (Sandbox Code Playgroud)
我的urls.py:
urlpatterns = [
url(r'(?P<post_id>[^/]+)', GenreDetail.as_view(), name = 'post'),
url(r'(?P<post_id>[^/]+)/(?P<slug>[-\w]+)$', GenreDetail.as_view()),
]
Run Code Online (Sandbox Code Playgroud)
我得到的错误:
AttributeError at /2/memoirs-of-a-geisha-by-arthur-golden
Generic detail view GenreDetail must be called with either an object pk or a slug.
Run Code Online (Sandbox Code Playgroud)
因此pk或slug不会传递给Generic Detailview.我怎么通过?我假设从url它可以接收,但事实并非如此.
我有一个基于类的视图,我希望只有在用户登录时才能访问它,并且我希望将未经身份验证的用户重定向回索引页面
这是有问题的观点:
class ArtWorkCreate(CreateView, LoginRequiredMixin):
login_url = '/login/'
redirect_field_name = 'login'
model = ArtWork
fields = ['userID','title','medium','status','price','description']
Run Code Online (Sandbox Code Playgroud)
这是相关的模型
class ArtWork(models.Model):
userID= models.ForeignKey(MyUser, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
medium = models.CharField(max_length=50)
price = models.FloatField()
description = models.TextField(max_length=1000)
status = models.CharField(max_length=4, default="SALE")
def __str__(self):
return self.title
Run Code Online (Sandbox Code Playgroud)
这是相关的网址
url(r'artwork/add/$', ArtWorkCreate.as_view(), name='artwork-add'),
Run Code Online (Sandbox Code Playgroud)
这是我想重定向到用户未登录的 URL id
url(r'^index/$', views.index, name='index'),
Run Code Online (Sandbox Code Playgroud)
我的目标是使表单只能访问登录用户,他们只能在他们自己的名字下添加艺术品项目
最后这是模型形式
class ArtWorkForm(ModelForm):
class Meta:
model = ArtWork
fields = ['title','medium','status','price','description']
Run Code Online (Sandbox Code Playgroud) 我在我的Django项目中创建了一个装饰器,用于将参数值注入到装饰方法的参数中.
我这样做是inspect.getargspec为了检查方法中存在哪些参数并将它们放入kwargs.否则,由于方法中的参数数量不正确,我会收到错误.
虽然这在单个视图方法中正常工作,但在Django基于类的视图方面却失败了.
我相信这可能是因为装饰器@method_decorator在类级别应用于dispatch方法而不是个人get和post方法.
我是一个蟒蛇新手,可能会忽略一些明显的东西.
有没有更好的方法来做我正在做的事情?是否可以在基于类的视图中获取方法参数名称?
我正在使用Python 2.7和Django 1.11
装饰者
def need_jwt_verification(decorated_function):
@wraps(decorated_function)
def decorator(*args, **kwargs):
request = args[0]
if not isinstance(request, HttpRequest):
raise RuntimeError(
"This decorator can only work with django view methods accepting a HTTPRequest as the first parameter")
if AUTHORIZATION_HEADER_NAME not in request.META:
return HttpResponse("Missing authentication header", status=401)
jwt_token = request.META[AUTHORIZATION_HEADER_NAME].replace(BEARER_METHOD_TEXT, "")
try:
decoded_payload = jwt_service.verify_token(jwt_token)
parameter_names = inspect.getargspec(decorated_function).args
if "phone_number" in parameter_names or "phone_number" …Run Code Online (Sandbox Code Playgroud) django ×10
python ×3
django-views ×2
composite ×1
django-forms ×1
django-urls ×1
request ×1
view ×1