我希望向用户提供表格,如果他之前没有在登录时填写,但如果他之前填写了信息,则将其重定向到主页。 我该如何做到这一点?
以下是我的观点:
def makinginfo(request):
form = SongForm(request.POST or None)
songprofile = SongProfile.objects.get().filter(user=request.user)
if songprofile = null: IS THIS RIGHT?
if form.is_valid():
form.save()
sp = SongProfile
sp.song = form.pk
sp.save()
if 'next' in request.POST:
next = request.POST['next']
else:
next = reverse('index_show')
return HttpResponseRedirect(next)
return render_to_response(
'song/create.html',
{'form':form},
context_instance = RequestContext(request)
)
else:
return render_to_response(
'song/show.html',
context_instance = RequestContext(request)
)
我在这里走在正确的轨道上吗?
谢谢,
附加信息:
SongProfile和Song是两种不同的模型。 SongProfile模型如下:
class SongProfile(models.Model):
song = models.OneToOneField(Song)
所以当我试图在songprofile.song保存歌曲中创建的唱片的最新id / pk时,在歌曲和歌曲中保存。这是错的吗?
答案 0 :(得分:5)
我假设每个用户只有一个SongProfile对象。
try:
songprofile = SongProfile.objects.get(user=request.user)
# Render song/show.html
except SongProfile.DoesNotExist:
if form.is_valid():
# Process post
# Render song/create.html
使用表单创建的歌曲创建一个新的SongProfile对象:
song = form.save()
songprofile = SongProfile(user=request.user)
songprofile.song = song
songprofile.save()
再次编辑:
修正向后的东西并添加了Song对象。
答案 1 :(得分:2)
你确实可以像蒂姆所展示的那样做try/catch
,这样可行。如果您发现自己在某些情况下开始过滤更多字段或者您想要合理的默认值,则可以按照文档的建议进行操作并使用get_or_create()
方法,如下所示:
sp, created = SongProfile.objects.get_or_create(user=request.user)
来自docs:
传递给get_or_create()的任何关键字参数 - 除了一个名为defaults的可选参数 - 都将用于get()调用。如果找到一个对象,get_or_create()将返回该对象的元组,并返回False。如果找不到对象,get_or_create()将实例化并保存一个新对象,返回一个新对象的元组和True。
因此布尔值指示是否需要创建对象,您可以使用它来指导方法逻辑。
这种语法也更简洁,更清晰。
至于尝试保存Song
和SongProfile
,不,你没错。正如Tim所示,form.save()
创建了新的song
和songprofile.song = song
,然后是songprofile.save()
,保存了songprofile
的歌曲参考。
代码示例中有一些小错误。一个错误是,
if songprofile = null:
...
,你是否使用它,正如@Natim所说,应该是,
if songprofile is None:
...
另一个问题在于,
sp = SongProfile
哪个Python确实会编译,但是它将SongProfile
类对象引用赋给变量而不是类本身的实例。你通常想做的是,
sp2 = SongProfile()
这将创建对象实例。如果您执行dir(sp)
和dir(sp2)
,则会看到差异。