因此,下面是我在观看 Django Con EU 谈话视频后通过基于第一类的视图创建的。
它有效并且理解它的作用。我不明白基于类的视图和我刚刚构建的通用类基视图之间的区别?
class GroupListView(ListView):
"""
List all Groups.
"""
context_object_name = 'groups'
template_name = 'contacts/home.html'
def get_context_data(self, **kwargs):
"""
Get the context for this view.
"""
# Call the base implementation first to get a context.
context = super(GroupListView, self).get_context_data(**kwargs)
# Add more contexts.
context['tasks'] = Upload.objects.filter(uploaded_by=self.request.user).order_by('-date_uploaded')[:5]
context['unsorted'] = Contact.objects.unsorted_contacts(user=self.request.user).count()
return context
def get_queryset(self):
"""
Get the list of items for this view. This must be an iterable, and may
be a queryset (in which …Run Code Online (Sandbox Code Playgroud) 我正在制作一个基本的应用程序来教初学者。每个用户都可以写笔记,但我想让用户无法查看或更新不同用户的笔记。
我有以下观点,但我不得不重复一遍。
from django.core.exceptions import PermissionDenied
...
class NoteUpdate(LoginRequiredMixin, UpdateView):
...
def get(self, request, *args, **kwargs):
self.object = self.get_object()
if self.object.owner != self.request.user:
raise PermissionDenied
return super(NoteUpdate, self).get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
self.object = self.get_object()
if self.object.owner != self.request.user:
raise PermissionDenied
return super(NoteUpdate, self).post(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
我觉得可能有一种方法可以在不重复自己的情况下做到这一点。是的,我可以编写一个这样的方法并从两者中调用它:
def check_permission(self):
if self.object.owner != self.request.user:
raise PermissionDenied
Run Code Online (Sandbox Code Playgroud)
但我真正的意思是我是否覆盖了错误的方法?有没有更传统的方法来做到这一点?覆盖 .get() 和 .post() 感觉有点奇怪
class Shipment(ListView):
template_name = "listing-base.html"
model = Shipment
context_object_name = "shipment_list"
paginate_by = 25
Run Code Online (Sandbox Code Playgroud)
输出是这样的
Previous Page 1 of 7 NEXT PAGE
Run Code Online (Sandbox Code Playgroud)
相反我需要
Previous Page 1 2 ...5..7 NEXT PAGE
Run Code Online (Sandbox Code Playgroud)
请帮忙提前致谢”
我在 Django 中使用基于类的视图。@login_required 装饰器没有重定向到登录页面。它仍然显示个人资料页面。
class ProfileView(TemplateView):
template_name='profile.html'
@login_required(login_url='/accounts/login/')
def dispatch(self, *args, **kwargs):
return super(ProfileView, self).dispatch(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
谁能帮我。我是 Django 新手,任何帮助将不胜感激。
提前致谢
使用 Django 的基于类的视图,如果表单无效,如何在返回响应时将状态代码设置为 400?从功能角度来看,这很容易,但无论表单有效性如何,CBV 都会响应 200 状态。
class CRMContactsAdd(CreateView):
model = models.Contact
fields = ['name','job_title','phone_number','email_address','notes']
template_name = 'crm/add_contact.html'
def get_success_url(self):
return reverse('CRM-list')+"?show_modal_url="+reverse('CRM-contacts',args=())
def get_context_data(self, **kwargs):
cd = super(CRMContactsAdd,self).get_context_data(**kwargs)
cd['company'] = get_object_or_404(models.Company,pk=self.kwargs['pk'])
cd['title'] = "Add contact to %s" % (cd['company'].name)
return cd
def form_valid(self, form):
contact = form.save(commit=False)
contact.company = get_object_or_404(models.Company,pk=self.kwargs['pk'])
return super(CRMContactsAdd,self).form_valid(form)
Run Code Online (Sandbox Code Playgroud)
我想要这样做的原因是,我可以轻松地使用状态代码来说明是否使用模式窗口中的表单重新加载顶级窗口或使用提交表单的响应更新模式。
当我(作为一个 Django 初学者)无法通过pk我的FormView子类中的主键(来自 URL)访问模型对象并试图了解如何正确地做到这一点时,我只是危险地接近疯狂。这很混乱。
那么关键字参数是如何在通用 CBV 中传递的,它们应该如何处理和使用?
(我将自己回答,因为我发现并写了它以便正确理解它。)
我的问题:UpdateView 创建新对象而不是更新以前的对象,我认为这是因为在我的视图的类定义中,我像这样覆盖了 get_object 方法:
def get_object(self, queryset=None):
try:
object_get = self.model.objects.get(pk=self.kwargs['pk'])
except ObjectDoesNotExist:
raise Http404("No object found matching this query")
if self.request.user.is_authenticated():
if object_get.owner == self.request.user:
return object_get
Run Code Online (Sandbox Code Playgroud)
因此,如果当前用户不是对象的所有者 - 此方法不返回任何内容 - 这是我想要的,但我的表单类改为创建新对象:
class ClientCreation(forms.ModelForm):
class Meta:
model = Client
fields = ('name', 'loyal')
Run Code Online (Sandbox Code Playgroud)
我认为这是因为表单没有收到 self.instance 而是创建新的 - 在这种情况下我应该怎么做?我不希望创建新对象,以防当对象的所有者不是当前用户时,我不希望发生任何事情,然后发送这样的发布请求。我应该如何正确实现这一点?
更新views.py:
class Distinct(generic.UpdateView):
def get_object(self, queryset=None):
try:
object_get = self.model.objects.get(pk=self.kwargs['pk'])
except ObjectDoesNotExist:
raise Http404("No object found matching this query")
if self.request.user.is_authenticated():
if object_get.owner == self.request.user:
return object_get
def get_form_kwargs(self):
kwargs = …Run Code Online (Sandbox Code Playgroud) 作为对基于类的视图有点陌生的人,我决定使用它们来驱动我正在开发的应用程序中的一些图表。
但是,我想让这个图表动态化,并希望它根据看到它的人而改变。
如何将请求(从用户获取)传递给基于类的视图?
下面是我的非工作实现(使用虚拟数据但没有传递请求):
看法:
class LineChartJSONView(BaseLineChartView, request):
user = request.user
def get_labels(self):
labels = []
items = Item.objects.filter(user = user)
for i in items:
labels.add(i.name)
return labels
def get_data(self):
prices = []
items = Item.objects.filter(user = user)
for i in items:
prices.add(i.price)
return prices
line_chart = TemplateView.as_view(template_name='dashboard/test_chart.html')
line_chart_json = LineChartJSONView.as_view()
Run Code Online (Sandbox Code Playgroud)
网址:
url(r'^chart_data/$', LineChartJSONView.as_view(), name='line_chart_json'),
url(r'^chart/$', views.ViewBaseChart, name='basic_chart'),
Run Code Online (Sandbox Code Playgroud)
HTML:
{% load staticfiles %}
<html>
<head>
<title>test chart</title>
</head>
<body>
<canvas id = "myChart" width="500" height="200"></canvas>
<!-- jQuery 2.2.3 -->
<script …Run Code Online (Sandbox Code Playgroud) 我创建了一个 CBV,我想根据用户删除其中的一个或多个字段。这个想法是一个工作场所,如果登录用户是招聘人员,employer则应包括该字段,否则应排除该字段。
表格.py
class JobCreationForm(forms.ModelForm):
class Meta:
model = Job
# exclude = ['posted', 'provider', 'ext_id']
fields = ('title',
'job_desc',
'agency_name',
'employer',
'contact_name',
)
Run Code Online (Sandbox Code Playgroud)
视图.py
class JobCreateView(LoginRequiredMixin, CreateView):
template_name = 'job/job.html'
form_class = JobCreationForm
success_url = '/'
def get_context_data(self, **kwargs):
context = super(JobCreateView, self).get_context_data(**kwargs)
# import the Customers of this Company
self.fields["agency_name"].remove()
recruiter = self.request.user
self.fields["contact_name"].queryset = Profile.objects.filter(user_id = self.request.user)
# if the user is a recruiter, delete the employer field.
if Company.objects.filter(user_id = self.request.user).values('is_recruiter') == False:
pass …Run Code Online (Sandbox Code Playgroud) 我有一个遗留代码:
我的网址:
url(r'^check_unique_username/(?P<field_value>(.*?){1,150})/$',
auth.views.check_unique_username, name='check_unique_username'),
Run Code Online (Sandbox Code Playgroud)
我的看法:
def check_unique_username(request, field_value):
return HttpResponse(check_unique_filed_value(request, "username", field_value))
Run Code Online (Sandbox Code Playgroud)
完美配合localhost:8000/check_unique_username/myusername
但现在我想让它基于类:
网址:
url(r'^check_unique_username/(?P<field_value>(.*?){1,150})/$',
auth.views.CheckUniqueUsername.as_view(), name='check_unique_username'),
Run Code Online (Sandbox Code Playgroud)
看法:
class CheckUniqueUsername(APIView):
def get(self):
return HttpResponse(CheckUniqueFieldValue.check_uniqueness("username", self.request.get('username')))
Run Code Online (Sandbox Code Playgroud)
这引发了
TypeError: get() got an unexpected keyword argument 'username'
我应该怎么办?tnx
更新: 我将我的观点更改为:
class CheckUniqueUsername(APIView):
def get(self):
return HttpResponse(CheckUniqueFieldValue.check_uniqueness("username", self.kwargs['field_value']))
Run Code Online (Sandbox Code Playgroud)
但仍然收到错误
TypeError: get() got an unexpected keyword argument 'field_value'