标签: class-based-views

如何在django 1.3中进行DetailView?

我目前正在学习如何在django 1.3中使用基于类的视图.我正在尝试更新一个应用程序来使用它们,但我仍然不太清楚它们是如何工作的(我每天都会读两次或三次基于类的视图参考).

对于这个问题,我有一个空间索引页面需要一些额外的上下文数据,url参数是一个名称(没有pk,无法更改,这是预期的行为)和没有该空间的用户在他们的个人资料中选择无法输入.

我基于函数的代码(工作正常):

def view_space_index(request, space_name):

    place = get_object_or_404(Space, url=space_name)

    extra_context = {
        'entities': Entity.objects.filter(space=place.id),
        'documents': Document.objects.filter(space=place.id),
        'proposals': Proposal.objects.filter(space=place.id).order_by('-pub_date'),
        'publication': Post.objects.filter(post_space=place.id).order_by('-post_pubdate'),
    }

    for i in request.user.profile.spaces.all():
        if i.url == space_name:
            return object_detail(request,
                                 queryset = Space.objects.all(),
                                 object_id = place.id,
                                 template_name = 'spaces/space_index.html',
                                 template_object_name = 'get_place',
                                 extra_context = extra_context,
                                )

    return render_to_response('not_allowed.html', {'get_place': place},
                              context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

我的基于类的视图(不工作,不知道如何继续):

class ViewSpaceIndex(DetailView):

    # Gets all the objects in a model
    queryset = Space.objects.all()

    # Get the url parameter intead of matching the PK
    slug_field = …
Run Code Online (Sandbox Code Playgroud)

django django-views django-class-based-views class-based-views

5
推荐指数
1
解决办法
8664
查看次数

图像上传和基于CreateView的视图

我希望能够使用CreateView和ModelForm上传图像文件但我无法使其工作 - 看起来表单在选择文件后不会绑定任何文件数据.以下是视图的当前内容:

class AddContentForm(forms.ModelForm):
    class Meta:
        model = Media


class AddContentView(CreateView):
    template_name = 'simple_admin/add_content.html'
    form_class = AddContentForm

    def get_success_url(self):
        return u'/opettajat/subcategory/{0}/{1}/'.format(self.kwargs['subcat_name'].decode('utf-8'), self.kwargs['subcat_id'].decode('utf-8'))


    def form_valid(self, form):
        isvalid = super(AddContentView, self).form_valid(form)
        s = Subcategory.objects.get(pk=self.kwargs['subcat_id'].encode('utf-8'))
        if self.request.POST.get('image'):
            image = form.cleaned_data['image']
            title = form.cleaned_data['art_title'].encode('utf-8')
            year_of_creation = form.cleaned_data['year_of_creation']
            m = Media.objects.get_or_create(image=image, art_title=title, year_of_creation=year_of_creation)[0]
            s.media.add(m)
            s.save()
       return isvalid

    def get_context_data(self, **kwargs):
        context = super(AddContentView, self).get_context_data(**kwargs)
        context['subcategory_name'] = self.kwargs['subcat_name'].encode('utf-8')
        context['subcategory_id'] = self.kwargs['subcat_id'].encode('utf-8')
        return context

     @method_decorator(login_required)
     def dispatch(self, request, *args, **kwargs):
        return super(AddContentView, self).dispatch(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?可以理解基于类的图像上载视图的简单示例.

django image-upload class-based-views

5
推荐指数
1
解决办法
5406
查看次数

在Django Formset中过滤对象

我使用inlineformset_factory来生成一个formset,如下所示:

FormSet = inlineformset_factory(Model1, Model2, extra=0)
if request.method =="POST":
    formset = FormSet(request.POST, instance=model1_object)
    if formset.is_valid():
        formset.save()
        return HttpResponseRedirect( reverse-blah )
else:
    formset = PupsFormSet(instance=model1_object,)
return render_to_response("template.html", {"formset":formset, 'model1_object':model1_object},context_instance=RequestContext(request)) 
Run Code Online (Sandbox Code Playgroud)

我有两个问题

  1. 如何限制Model2对象,以便不是所有适用的对象都存在,而只是过滤的子集?
  2. 有没有人有任何使用formset的基于类的视图的示例代码?

更新了功能代码回答问题#1

FormSet = inlineformset_factory(Model1, Model2, extra=0)
if request.method =="POST":
    formset = FormSet(request.POST, instance=model1_object, queryset=Model2.objects.filter(foo=bar))
    if formset.is_valid():
        formset.save()
        return HttpResponseRedirect( reverse-blah )
else:
    formset = PupsFormSet(instance=model1_object, queryset=Model2.objects.filter(foo=bar))
return render_to_response("template.html", {"formset":formset, 'model1_object':model1_object},context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

django django-forms formset django-class-based-views class-based-views

4
推荐指数
1
解决办法
3998
查看次数

Django:带有附加字段的CreateView?

我正在尝试编写一个Django CreateView(CBV),它取代用户id而不是用户电子邮件,并根据电子邮件确定(或创建)用户.

我的模型不包含任何特殊内容:

class Project(models.Model):
    name = models.CharField(_('Title'), max_length=100,)
    user = models.ForeignKey(User, verbose_name=_('user'),)
    ...
Run Code Online (Sandbox Code Playgroud)

我的forms.py将额外的电子邮件字段添加到表单中:

class ProjectCreateForm(forms.ModelForm):
    email = forms.EmailField(required=True, )

    class Meta:
        model = Project
        fields = ('name', ...,)
Run Code Online (Sandbox Code Playgroud)

在我的views.py中,我试图确定用户是否存在或是否应该创建.在这两种情况下,用户标识都应保存为Project实例的一部分.

class ProjectCreateDetails(CreateView):
    form_class = ProjectCreateForm
    template_name = '...'
    success_url = reverse_lazy('login') 
    model = Project

    def form_valid(self, form):
        try:
            user = User.objects.get(email=form.email)
        except User.DoesNotExist:
            user = User.objects.create_user(form.email, form.email, ''.join([random.choice(string.digits + string.letters) for i in range(0, 10)]))
            user.save()
        form.instance.user = user
        return super(ProjectCreateDetails, self).form_valid(form)
Run Code Online (Sandbox Code Playgroud)

但是我面临一个错误'Solution' object has no attribute 'email' …

python forms django django-class-based-views class-based-views

4
推荐指数
1
解决办法
6151
查看次数

CreateView没有返回HttpResponse

我有以下视图扩展基础CreateView:

class PeopleImportCsv(FailedLoginMessageMixin, CreateView):
    model = CsvFile
    form_class = CustomerCsvImportForm
    template_name = 'people/customer_uploadcsv_form.html'

    def get_success_url(self):
        url = reverse('customer_process_csv', args=[self.object.id])
        return url

    def form_valid(self, form):
        instance = form.save(commit=False)
        instance.uploaded_by = self.request.user
        super(PeopleImportCsv, self).form_valid(form)
Run Code Online (Sandbox Code Playgroud)

我正在使用get_success_url()方法,因此我可以在数据库中获取新创建的对象的id.但是,当我尝试提交表单时,我收到以下ValueError消息:

The view people.views.PeopleImportCsv didn't return an HttpResponse object.
Run Code Online (Sandbox Code Playgroud)

如果我assert False在get_success_url()中分配url之后立即放置一个,那么我可以看到它有正确的url我期待所以我该怎么做才能解决这个问题?

django class-based-views

3
推荐指数
1
解决办法
1732
查看次数

Django:在基于类的通用视图ListView中访问HttpRequest

我将通过在views.py中将ListView子类化来实现基于自定义类的通用视图。我的问题是如何在我的子类中访问请求(HttpRequest对象)参数?我所属的HttpRequest对象是views.py中所有函数的默认请求参数。例:

def search(request):
Run Code Online (Sandbox Code Playgroud)

更清楚地说,这是我到目前为止已经尝试的方法:

** views.py

class CustomListView(ListView):
    temp = ""

    def get(self, request, *args, **kwargs):
        self.temp = request.GET.get('temp')
        return super(CustomListView, self).get(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(CustomListView, self).get_context_data(**kwargs)
        context['temp'] = self.temp
        return context
Run Code Online (Sandbox Code Playgroud)

** urls.py

url(r'^temp/$, CustomListView.as_view(queryset=Document.objects.all()[:1],template_name="temp.html")),
Run Code Online (Sandbox Code Playgroud)

** temp.html

{% extends 'base.html' %}
{% block content %}
<h2>{{ temp }}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行服务器并访问/ temp /(temp.html)时,所看到的只是“无”。因此,“ temp”为“”或“ temp”根本没有创建。

任何想法都将不胜感激。谢谢!

python django django-class-based-views class-based-views

2
推荐指数
1
解决办法
4746
查看次数

是否可以在ListView模板中使用表单?

我建立了一个工作正常的listview,并给了我我想要的东西.

在这个ListView的模板中,我声明了一个指向CreateView的表单.表格是这样的,

{% if user.is_authenticated %}
<form action="{% url 'post_wall' %}" method="POST">
    {% csrf_token %}
    <input type='text' name='body' />
    <input type='hidden' name='from_user' value='{{ user.id }}' />
    <input type='hidden' name='to_user' value='{{ to_user }}' />
    <input type='submit' value='POST'/>
</form>
{% endif %}
Run Code Online (Sandbox Code Playgroud)

post_wall网址对应

url(r'accounts/post_wall', WallCreate.as_view(), name='post_wall'),
Run Code Online (Sandbox Code Playgroud)

包含表单的网址是

url(r'accounts/wall/(?P<slug>\w+)/$', WallList.as_view(), name='wall'),
Run Code Online (Sandbox Code Playgroud)

这会调用CreateView,

class WallCreate(CreateView):
    model = WallPost

    def get_success_url(self):
        url = reverse('wall', kwargs={'slug': request.POST.to_user})
        return HttpResponseRedirect(url)
Run Code Online (Sandbox Code Playgroud)

这给了我一个

TemplateDoesNotExist at /accounts/post_wall
users/wallpost_form.html
Run Code Online (Sandbox Code Playgroud)

当帖子被发送到CreateView时,这不应该正常工作吗?或者我误解了有关CBV的事情?

django django-class-based-views class-based-views

1
推荐指数
1
解决办法
2524
查看次数

将基于django类的视图添加到管理站点

我使用基于类的视图创建了一些表单,现在我想将它们添加到Django Admin站点.我刚刚找到此链接,其中描述了向管理站点添加普通视图.

django admin class-based-views

1
推荐指数
2
解决办法
2307
查看次数

为什么Django DetailView没有可用的kwargs

为什么我不能在DetailView中访问从url字符串传递的kwargs ['party_id']?

Test url: http://127.0.0.1:8000/party/3/activity/2/
Run Code Online (Sandbox Code Playgroud)

urls.py

url(r'^party/(?P<party_id>\d*)/activity/(?P<pk>\d*)/$', ActivityView.as_view(), name='activity')
Run Code Online (Sandbox Code Playgroud)

views.py

class ActivityView(DetailView):
    template_name = "ooe/activity_results.html"
    context_object_name = "activity"
    model = Activity

    def get_context_data(self, **kwargs):
        context = super(ActivityView, self).get_context_data(**kwargs)
        #this line is not working because kwargs is just: {'object': <Activity: Activity 2>}
        context['submissions'] = self.get_object().get_submissions(kwargs['party_id'])       
        return context

    @method_decorator(user_passes_test(active_participant))
    def dispatch(self, *args, **kwargs):
        return super(ActivityView, self).dispatch(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

python django django-class-based-views class-based-views

0
推荐指数
1
解决办法
1290
查看次数

无法将'user'参数传递给django中的ChangePasswordForm

美好的一天!

我正在学习基于类视图的Django(1.8).Django本身提供了一个验证模块,可以更改用户的密码.在使用Django的 PasswordChangeForm(扩展Django的 SetPasswordForm)时,我偶然发现了以下错误:

init()缺少1个必需的位置参数:'user'

当我看一下SetPasswordForm类时,我可以看到它需要一个user-object作为参数.

def __init__(self, user, *args, **kwargs):
    self.user = user
    super(SetPasswordForm, self).__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)


我最初做了什么?
首先,在我看来,我只是分配了Django的PasswordChangeForm:

class ChangePassword(LoginRequiredMixin, FormView):
    template_name = 'users/reset_password.html'
    form_class = PasswordChangeForm
Run Code Online (Sandbox Code Playgroud)

这当然导致了错误,因为没有提供用户对象.

那么我试图解决这个问题呢?

尝试一个:自定义表单,它继承自PasswordChangeForm并添加init方法.
由于PasswordChangeForm没有init方法,我创建了一个名为MyPasswordChangeForm的新表单类,它继承自PasswordChangeForm并添加了init:

class MyPasswordChangeForm(PasswordChangeForm):
    def __init__(self, request, *args, **kwargs):
        super(MyPasswordChangeForm, self).__init__(request.user, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

预期结果:MyPasswordChangeForm->继承自PasswordChangeForm并在SetPasswordForm中添加init-> super init-> perform init
实际结果:super正在调用LoginRequiredMixin:

init()缺少1个必需的位置参数:'
request'stack-tr l:80返回super(LoginRequiredMixin,self).dispatch(request,*args,**kwargs)

尝试"两个":次要更改 将super-> MyPasswordChangeFrom更改为super-> PasswordChangeForm

尝试三:使用mixin,但不幸的是有与上面相同的结果.

尝试四:尚未完成,但最终选择?但必须有一种方法尽可能多地使用django的形式.

所以我的问题是...... 有人可以通过Django的PasswordChangeForm对如何将(经过身份验证的)用户对象传递给Django的SetPasswordForm提供一个提示或小解释,因此我可以尽可能多地使用当前存在的表单.

提前致谢!

forms django inheritance class-based-views

0
推荐指数
1
解决办法
525
查看次数