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),因为我被困在重定向部分的表单上
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__'
class SpaceForm(ModelForm):
class Meta:
model = Space
fields = '__all__'
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')
]
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详细信息页面吗?
提前感谢您提供任何帮助
更新
我最后使用了一个普通的功能视图,结果是这样的:
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)
url(r'^(?P<venue_id>[0-9]+)/new_space/$', views.new_space, name='new_space')
所有人似乎都运作良好。