Django - 无法将User作为ForeignKey工作

时间:2016-01-03 19:42:00

标签: python django foreign-keys

我正在构建一个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成功传入表单。

1 个答案:

答案 0 :(得分:2)

问题1:

form.uploader = request.user

应该是:

form.user = request.user

我在游戏模型中看不到uploader属性

问题2:

GameForm Meta课程中,以下行包含user字段:

fields = ('title','image','description','requirements','code')