我目前正在学习如何在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
我希望能够使用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)
有人可以帮忙吗?可以理解基于类的图像上载视图的简单示例.
我使用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
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
我正在尝试编写一个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
我有以下视图扩展基础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我期待所以我该怎么做才能解决这个问题?
我将通过在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”根本没有创建。
任何想法都将不胜感激。谢谢!
我建立了一个工作正常的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 Admin站点.我刚刚找到此链接,其中描述了向管理站点添加普通视图.
为什么我不能在DetailView中访问从url字符串传递的kwargs ['party_id']?
Test url: http://127.0.0.1:8000/party/3/activity/2/
Run Code Online (Sandbox Code Playgroud)
url(r'^party/(?P<party_id>\d*)/activity/(?P<pk>\d*)/$', ActivityView.as_view(), name='activity')
Run Code Online (Sandbox Code Playgroud)
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) 美好的一天!
我正在学习基于类视图的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提供一个提示或小解释,因此我可以尽可能多地使用当前存在的表单.
提前致谢!
django ×10
python ×3
forms ×2
admin ×1
django-forms ×1
django-views ×1
formset ×1
image-upload ×1
inheritance ×1