我试图在基于Django类的视图中处理两个表单.该站点包含一个名为form(基于GET)的表单,用于缩小ListView和第二个表单status_form(基于POST)的列表结果.
两个表单都是必需的,因为ListView返回一个项列表.Form让用户限制选择并status_forms让用户通过模态表单标记不正确的项目(因此它需要在同一模板中).
我的麻烦是,ListView方法没有post,但是FormView.我的类List继承自这两个类,但是当我执行该类时,我收到错误消息:
属性错误:'List'对象没有属性'status_form'
我该如何更改我的实现以允许通过post method?处理第二个表单?
class List(PaginationMixin, ListView, FormMixin):
model = ListModel
context_object_name = 'list_objects'
template_name = 'pages/list.html'
paginate_by = 10 #how may items per page
def get(self, request, *args, **kwargs):
self.form = ListSearchForm(self.request.GET or None,)
return super(List, self).get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
self.status_form = StatusForm(self.request.POST or None)
if self.status_form.is_valid():
...
else:
return super(List, …Run Code Online (Sandbox Code Playgroud) python django formview django-class-based-views class-based-views
我们对大多数项目使用基于类的视图.当我们尝试创建一个CSV Mixin时,我们遇到了一个问题,它允许用户将来自几乎任何页面的信息导出为CSV文件.我们的特殊问题涉及CSV文件,但我相信我的问题是通用的,足以与任何文件类型相关.
我们遇到的问题是视图的响应是试图转到模板(比如说from django.views.generic import TemplateView).我们在urls.py文件中指定模板.
url(r'^$', MyClassBasedView.as_view(template_name='my_template.html'))
Run Code Online (Sandbox Code Playgroud)
如何强制响应绕过模板并返回标准HttpResponse?我猜你需要覆盖一个方法,但我不确定是哪一个.
有什么建议?
编辑1:看来我不清楚我们要做什么.我已经渲染了一个页面(通过基于类的视图),用户将看到信息报告.我需要输入一个"导出到CSV"按钮供用户按,它将在页面上导出信息并将CSV下载到他们的机器上.
不能将视图重写为基于方法的视图.我们处理几乎所有基于类的视图类型(DetailView,ListView,TemplateView,View,RedirectView等)
奇迹般有效:
MyCreateView(CreateView):
template_name = "my_template_name"
form_class = MyModelForm
success_url = "/success/"
Run Code Online (Sandbox Code Playgroud)
但以下不是:
MyUpdateView(UpdateView):
template_name = "my_template_name"
form_class = MyModelForm
success_url = "/success/"
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
MyUpdateView is missing a queryset. Define MyUpdateView.model, MyUpdateView.queryset, or override MyUpdateView.get_queryset().
Run Code Online (Sandbox Code Playgroud)
为什么UpdateView需要model,queryset或者get_queryset定义为不会导致错误而CreateView不是?它不应该能够从ModelForm中使用的模型中自动导出它吗?
我有一个包含用户列表的页面,并希望能够单击链接以更新其个人资料.点击"更新"后,我应该可以使用一个提交按钮在一个页面中编辑用户名,名字,...电子邮件,电话号码,部门等.我通过使用两个表单完成了这个,一个用于User,另一个用于额外信息.ListView,DeleteView和CreateView与这两种形式完美配合,但不适用于UpdateView.我无法使用初始数据实例化这两个表单.
问题是:如何用数据实例化两个表单?覆盖self.object?get_form_kwargs?什么是最优雅的解决方案?
UpdateView类如下所示.我不是在寻找'复制 - 粘贴'解决方案,但可能会指出我正确的方向.
谢谢.
保罗
电话号码,部门在名为Employee的模型中定义.
class Employee(models.Model):
user = models.OneToOneField(User)
phone_number = models.CharField(max_length=13, null=True)
department = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)
模板是:
{% extends "baseadmin.html" %}
{% load crispy_forms_tags %}
{% block content %}
<h4>Edit a user</h4>
<form action="" method="post" class="form-horizontal">
<legend>Edit a user</legend>
{% crispy form %}
{% crispy form2 %}
<div class="form-actions">
<input type="submit" class="btn btn-primary" value="Save">
<a href="{% url 'client_list' %}" class="btn">Cancel</a>
</div>
</form>
{% endblock content %}
Run Code Online (Sandbox Code Playgroud)
视图类是:
class ClientUpdateView(UpdateView):
model = User
form_class = ClientsUserForm
second_form_class …Run Code Online (Sandbox Code Playgroud) 我正在使用Django的通用关系来定义问答模型的投票模型.
这是我的投票模型:
models.py
class Vote(models.Model):
user_voted = models.ForeignKey(MyUser)
is_upvote = models.BooleanField(default=True)
# Generic foreign key
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
class Meta:
unique_together = ('content_type', 'user_voted')
Run Code Online (Sandbox Code Playgroud)
views.py
user_voted = MyUser.objects.get(id=request.user.id)
object_type = request.POST.get('object_type')
object = None;
if object_type == 'question':
object = get_object_or_404(Question, id=self.kwargs['pk'])
elif object_type == 'answer':
object = get_object_or_404(Answer, id=self.kwargs['pk'])
# THIS LAST LINE GIVES ME THE ERROR
vote, created = Vote.objects.get_or_create(user_voted=user_voted, content_object=object)
Run Code Online (Sandbox Code Playgroud)
然后我收到这个错误:
FieldError at /1/
Cannot resolve keyword 'content_object' into field. …Run Code Online (Sandbox Code Playgroud) 文档中的示例https://django-filter.readthedocs.org/en/latest/usage.html,我认为是基于函数的视图.我目前正在研究如何使用基于类的视图执行此操作.
def product_list(request):
f = ProductFilter(request.GET, queryset=Product.objects.all())
return render_to_response('my_app/template.html', {'filter': f})
Run Code Online (Sandbox Code Playgroud) 在定义 URL 模式时,我应该使用正则表达式从 URL 获取 PK。
如果我想要一个没有PK的URL,如果没有提供,它将使用当前登录的用户怎么办?例子:
/user将获得当前登录用户的 DetailView/user/edit 将显示当前登录用户的 UpdateView我尝试pk=在Detail.as_view()调用中对 the进行硬编码,但它报告无效的关键字。
如何在 URL conf 中指定?
我的示例代码显示访问/userURL时需要 PK 错误:
urlpatterns = patterns('',
url(r'user/$',
DetailView.as_view(
model=Account,
template_name='user/detail.html')),
)`
Run Code Online (Sandbox Code Playgroud) 我正在使用 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
我正在使用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
django ×9
python ×6
django-views ×3
django-forms ×1
django-urls ×1
django-users ×1
download ×1
formview ×1