我正在构建一个Django站点来共享Python游戏的代码,但是我遇到了将每个游戏与特定用户相关联的麻烦。我试图通过将用户用作ForeignKey
来实现这一点,我认为这是正确的方法,但我不能让用户实际插入数据库而不使用一些奇怪的黑客(如传递)用户将字符串作为隐藏user
字段的字符串,这完全不安全并导致其他问题。)
我的Game
课程如下:
class Game(models.Model):
user = models.ForeignKey(User, blank=True)
title = models.CharField(max_length=256)
image = models.ImageField(upload_to='games')
description = models.CharField(max_length=256)
requirements = models.CharField(max_length=256)
code = models.CharField(max_length=256000)
def __unicode__(self):
return self.title
添加游戏的表格:
class GameForm(forms.ModelForm):
image = forms.ImageField(required=False)
code = forms.CharField(widget=PagedownWidget(show_preview=True))
class Meta:
model = Game
fields = ('user','title','image','description','requirements','code')
User.game = property(lambda u: Game.objects.get_or_create(user=u)[0])
我在addgame.html
模板中创建了此表单的自定义版本:
<form action="/userprofile/addGame/" method="post">{% csrf_token %}
{% for field in form.visible_fields %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field.label_tag }}
<br>
{{ field }}
<br><br>
</div>
{% endfor %}
<input type="submit" value="Save">
</form>
我的视图如下所示:
@login_required
def add_game(request):
user = request.user
error_message = None
if request.method == 'POST':
form = GameForm(request.POST)
if form.is_valid():
form = form.save(commit=False)
form.uploader = request.user
form.save()
return HttpResponseRedirect('/userprofile')
else:
error_message = "Invalid Input"
else:
form = GameForm()
args = {}
args.update(csrf(request))
args['user'] = user
args['form'] = form
args['error_message'] = error_message
return render_to_response('addgame.html', args)
但是,我收到以下错误:
无法指定无:“Game.user”不允许空值。
我意识到User
实例尚未传递到表单中,因此我得到一个'不应该为空'错误,但我不知道如何正确传递{{1}实例到表单。我已经查看了有关此问题的几个问题,例如this,但我仍然无法将User
成功传入表单。
答案 0 :(得分:2)
问题1:
form.uploader = request.user
应该是:
form.user = request.user
我在游戏模型中看不到uploader
属性
问题2:
在GameForm
Meta
课程中,以下行不包含user
字段:
fields = ('title','image','description','requirements','code')