Django在另一个模板中形成

时间:2015-04-18 11:10:59

标签: python django forms

Django的新手,请耐心等待。

我一直在通过基本的教程和文档进行斗争,但没有找到满意的答案。

我有两种模式:

class Venue(models.Model):
    name = models.CharField(max_length=200)
    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('venue_detail', kwargs={'pk': self.pk})

class Space(models.Model):
    venue = models.ForeignKey('Venue', null=True)
    name = models.CharField(max_length=200)
    description = models.TextField(max_length=500) 
    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('space_detail', kwargs={'pk': self.pk})

空间属于场地。这一切都很好。

我想要做的是从VenueDetail视图创建一个Space,并使用Venue作为外键(即Space ModelForm上没有下拉选择)。

然而,我还没有尝试在空间形式中使用当前场地实例(这是被称为上下文?抱歉,来自Rails),因为我被困在重定向部分的表单上

views.py

class VenueDetail(FormView):
        model = Venue
        template_name = 'venues/detail.html'
        form_class = SpaceForm
        def get_context_data(self, **kwargs):
            context = super(VenueDetail, self).get_context_data(**kwargs)
            context['form'] = SpaceForm
            return context

class SpaceCreate(CreateView):
        model = Space
        template_name = 'spaces/space_form.html'
        fields = '__all__'

forms.py

class SpaceForm(ModelForm):
        class Meta:
                model = Space
                fields = '__all__'

venue_urls.py

urlpatterns = [
    url(r'^$', VenueListing.as_view(), name='venue_listing'),
    url(r'^(?P<pk>[0-9]+)/$', VenueDetail.as_view(), name='venue_detail'),
    url(r'^create/$', VenueCreate.as_view(), name='venue_create')

]

space_urls.py

urlpatterns = [
    url(r'^$', SpaceListing.as_view(), name='space_listing'),
    url(r'^(?P<pk>[0-9]+)/$', SpaceDetail.as_view(), name='space_detail'),
    url(r'^create/$', SpaceCreate.as_view(), name='space_create')
]

如果用户正在从VenueDetail视图创建空间,那么如果他们有任何错误,他们将获得显示错误的表单,但是在标准的SpacesCreate网址上。显然这种情况正在发生,因为表单POST到该URL然后调用SpaceCreate.as_view()。如果表单失败,用户真的会希望在同一个URL上。如果表单验证正常,那么它会转到正确的位置,即空格/ pk&#39;创建的空间,这是相当标准的。

基本上我要问的是Django包含一个表单来创建一个模型的方式是什么,在它的父母显示/详细页面上有所有预期的行为。也许我应该在Venue详细信息页面上使用自定义视图进行此表单操作?如果表单帖子没有验证,那么会专门重定向到相同的Venue详细信息页面吗?

提前感谢您提供任何帮助

更新

我最后使用了一个普通的功能视图,结果是这样的:

views.py

def new_space(request, venue_id):
        venue = Venue.objects.get(id = venue_id)
        context = {'form': SpaceForm, 'venue': venue}
        if request.method == 'POST':
                form = SpaceForm(request.POST)
                if form.is_valid():
                        new_space = form.save(commit=False)
                        new_space.venue = venue
                        new_space.save()
                        return HttpResponseRedirect(reverse('space_listing'))
                else:
                        return render(request, 'spaces/new_space.html', {'form': form})
        else:
                form = SpaceForm()
        return render(request, 'spaces/new_space.html', context)

urls.py

url(r'^(?P<venue_id>[0-9]+)/new_space/$', views.new_space, name='new_space')

所有人似乎都运作良好。

0 个答案:

没有答案