我刚开始学习python和django,我有一个问题.我得到了将函数视图转换为基于类的视图的赋值.但我的链接现在不起作用.
这些来自urls.py:
url(r'^$', ContactIndex.as_view()),
url(r'^add$', ContactAdd.as_view()),
url(r'^([0-9]+)/update$', ContactUpdate.as_view()),
url(r'^([0-9]+)/view$', ContactView.as_view()),
Run Code Online (Sandbox Code Playgroud)
这是我的链接:
{% url rtr_contact.views.ContactView contact.id %}
Run Code Online (Sandbox Code Playgroud)
但这不起作用它说:
Caught NoReverseMatch while rendering: Reverse for 'rtr_contact.views.ContactView' with arguments '(20L,)' and keyword arguments '{}' not found.
Run Code Online (Sandbox Code Playgroud) 我在我的模型中使用了Django的通用createview
from myproject.app.forms import PersonForm
class PersonMixin(object):
model = Person
form_class = PersontForm
class PersonCreateView(PersonMixin, CreateView):
pass
Run Code Online (Sandbox Code Playgroud)
这非常适合用我的自定义表单显示Person的创建视图.但是,我有一个字段,我希望预先填充一个值.我找到了这个答案:在基于类的通用视图中将初始值设置为modelform
但是,我预先填充的值来自request.user的配置文件.如何在PersonCreateView中访问请求并将其传递给表单?
django django-forms django-generic-views django-class-based-views
from forms import MyContactForm
from django.views.generic.edit import FormView
class MyFormView(FormView):
template_name = 'my_forms.html'
form_class = MyContactForm
success_url = '/thanks/'
Run Code Online (Sandbox Code Playgroud)
在我的模板中,表单的调用方式如下:
{{ form }}
但我怎么能这样称呼它:
{{ my_contact_form }}?
这将是object_context_name(对于模型)等效的形式.
如何在基于Classed的通用视图中访问request.user?
这是代码:
class TodayView(TemplateView):
template_name = "times/today.html"
if Records.objects.all().count() > 0:
last_record = Records.objects.latest('id')
else:
last_record = None
actual_time = datetime.today()
activities = Activity.objects.filter(owner=request.user)
def get_context_data(self, **kwargs):
context = super(TodayView, self).get_context_data(**kwargs)
context["today"] = self.actual_time
return context
Run Code Online (Sandbox Code Playgroud)
现在,我得到错误"请求未定义",如果我写"self.request.user",我得到"自我"没有定义,这是可以理解的.我可以想到几种方法来解决这个问题,但我想知道是否存在关于如何在Django Classed Based Generic Views上访问request.user的标准化/共识.
假设我们有一个名为Closet的应用程序,它有一些模型:
# closet.models.py
class Outfit(models.Model):
shirt = models.ForeignKey(Shirt)
pants = models.ForeignKey(Trouser)
class Shirt(models.Model):
desc = models.TextField()
class Trouser(models.Model):
desc = models.TextField()
class Footwear(models.Model):
desc = models.TextField
Run Code Online (Sandbox Code Playgroud)
使用通用详细信息视图,可以轻松地将URL配置为以下每个的详细信息:
#urls.py
urlpatterns = patterns('',
url(r'^closet/outfit/(?P<pk>\d+)$', DetailView(model=Outfit), name='outfit_detail'),
url(r'^closet/shirt/(?P<pk>\d+)$', DetailView(model=Shirt), name='shirt_detail'),
url(r'^closet/trouser/(?P<pk>\d+)$', DetailView(model=Trouser), name='trouser_detail'),
url(r'^closet/footwear/(?P<pk>\d+)$', DetailView(model=Footwear), name='footwear_detail'),
)
Run Code Online (Sandbox Code Playgroud)
我接下来要做的是定义将创建每种类型的新对象的视图.我想这样做的扩展版本CreateView将能够处理预先填充的字段上的数据.
具体来说,我想要以下行为:
/closet/outfit/new我希望得到一个标准ModelForm的Outfit一切空白,一切编辑模式./closet/outfit/new/?shirt=1我想看到我在案例1)中看到的所有字段,但我希望衬衫字段预先填充pk = 1的衬衫.此外,我希望衬衫字段显示为不可编辑.如果表单已提交且被视为无效,则在重新显示表单时,我希望衬衫字段继续不可编辑./closet/outfit/new/?shirt=1&trouser=2我想看到我在案例1)中看到的所有领域,但现在衬衫和裤子领域都应该是预先设定的并且是不可编辑的.(即只有footwear字段应该是可编辑的.)一般来说,这可能吗?即,查询字符串可以这种方式修改显示的表单的结构吗?我希望尽可能以DRYest方式实现这一目标.我的直觉告诉我这应该是基于类的观点可行,也许会涉及model_form_factory但我无法在我的脑海中找到逻辑.特别是,我不确定是否有可能让基于类的视图在构造时访问request.REQUEST(即request.POST或request.GET参数)ModelForm.
也许只有当我为锁定的字段使用不同的查询字符串关键字时才可能.也许URL需要是:/closet/outfit/new/?lock_shirt=1和/closet/outfit/new?lock_shirt=1&lock_trouser=2 …
django django-forms django-generic-views django-class-based-views
我正在尝试实现一个约会制作应用程序,用户可以在其中创建与预先存在的类相关联的会话.我想要做的是使用django CreateView创建一个会话而不要求用户提供相关的类,同时在会话中为会话分配一个类.我试图通过在url中传入类的pk来做到这一点,这样我就可以在CreateView中查找类并将类分配给会话.
我无法弄清楚的是如何做到这一点.我猜在模板中我希望<a href="{% url create_sessions %}?class={{ object.pk }}>Create Session</a>在类的DetailView中有类似的东西,并且在我的urls.py文件中包含该行的url
url(r'^create-sessions?class=(\d+)/$', CreateSessionsView.as_view(), name = 'create_sessions'),但我对django很新,并且不完全了解这里的位置参数被发送到我的CBV以及如何使用它.
我将课程保存到会话的计划是将form_valid我的CBV 覆盖为:
def form_valid(self, form):
form.instance.event = event
return super(CreateSessionsView, self).form_valid(form)
如果这是明显不正确的,请告诉我.
谢谢!
我有一个基于类的 ListView,我想通过登录的 user_id 过滤对象,因为项目模型有一个指向 settings.AUTH_USER_MODEL 的外键
class ItemListView(LoginRequiredMixin, StaffRequiredMixin, ListView):
model = Item
template_name = "items/list_items.html"
Run Code Online (Sandbox Code Playgroud)
在基于函数的视图中,我可以使用 request.user 但不能在基于通用类的视图中执行此操作。关于如何最好地做到这一点的任何想法?
这是项目模型
class Item(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL)
description = models.CharField(max_length=300)
Run Code Online (Sandbox Code Playgroud) django django-generic-views python-3.x django-class-based-views django-1.8
我正在尝试创建一个简单的博客,我可以在其中直接与用户交流。每个用户每个月都会有一篇由管理员发布的博客文章,他们可以对其发表评论以进行交流。工作流程如下:
管理员登录站点 -> 管理员显示所有可用用户。-> 管理员点击用户 -> 如果该用户有当月的帖子,则显示该帖子 -> 否则创建新帖子。
这是我所拥有的:
博客/urls.py:
from django.urls import path
from .views import MessageThread, CreateThread
urlpatterns = [
path('user_thread/<int:user_id>', MessageThread.as_view(), name='message_thread'),
path('create_thread/<int:user_id>', CreateThread.as_view(), name='create_thread'),
]
Run Code Online (Sandbox Code Playgroud)
博客/models.py:
from django.db import models
from django.contrib.auth.models import User
class Post(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
text = models.TextField(max_length=9001)
posted_for = models.ForeignKey(User, related_name='posted_for', on_delete=models.CASCADE)
published_date = models.DateTimeField(blank=True, null=True)
def __str__(self):
return self.title
Run Code Online (Sandbox Code Playgroud)
博客/forms.py:
from django.forms import models
from .models import Post
class CreateThreadForm(models.ModelForm):
class Meta:
model = …Run Code Online (Sandbox Code Playgroud) 当我想对使用 django_filter 创建的过滤器进行分页时,我遇到了问题,在我的模板中,它向我显示了查询集和过滤器,但分页不起作用,我想知道为什么会发生这种情况以及您是否可以帮助我。
我将插入我的代码片段,以便您可以看到。
这是我的观点.py
PD:我有所有必需的进口品。
@method_decorator(staff_member_required, name='dispatch')
class EmployeeListView(ListView):
model = Employee
paginate_by = 4
def dispatch(self, request, *args, **kwargs):
if not request.user.has_perm('employee.view_employee'):
return redirect(reverse_lazy('home'))
return super(EmployeeListView, self).dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['filter'] = EmployeeFilter(self.request.GET, queryset = self.get_queryset())
return context
Run Code Online (Sandbox Code Playgroud)
过滤器.py
import django_filters
from .models import Employee, Accident
class EmployeeFilter(django_filters.FilterSet):
class Meta:
model = Employee
fields = {
'rutEmployee' : ['startswith']
}
Run Code Online (Sandbox Code Playgroud) python django listview django-filter django-class-based-views
我目前正在开发一个管理仪表板,其中仅包含标记为Business用户的公司管理员的特定视图。
该应用程序将有大约 10 次浏览,我有一些关于UserPassesTestMixin
基本上我所有的观点都会包括这一点,
def test_func(self):
return self.request.user.user_type == 'Business'
Run Code Online (Sandbox Code Playgroud)
为了确保用户是Business用户,我以这种方式保护视图。
我自己无法解决的几个问题是:
现在,如果重复 10 次,是否有一种更干净的方法来做到这一点,而不是
def test_func在每个 CBV 中都采用这种方法?
出现的另一个问题是,如果用户没有通过测试,它会重定向到登录页面,我也不喜欢这个页面。这些视图都返回 json。如果用户没有通过测试,我想将他们发送到类似的地方,
JsonResponse({'message': 'Only company administrators have access to this view'})
Run Code Online (Sandbox Code Playgroud)
仅当用户未通过测试时,我如何才能更改该重定向?请记住,这些视图也继承自LoginRequiredMixin其中,如果用户未登录,我想保持登录页面的原始重定向不变。
非常感谢对此的任何帮助。Django 的这一面对我来说相当新鲜!
django django-views django-permissions django-class-based-views
django ×10
django-forms ×2
django-views ×2
python ×2
django-1.8 ×1
generics ×1
hyperlink ×1
listview ×1
python-3.x ×1