使用用户ID保存modelform?

时间:2016-06-12 11:41:41

标签: django django-models django-forms django-views

我有一个关于我正在创建的新项目的问题。简而言之,该网站拥有用户帐户,每个用户都可以创建一个简单的段落。表单运行正常,但我似乎无法将用户ID分配给已保存的表单。

model.py

class UserProfile(models.Model):
    user = models.OneToOneField(User)

class Thoughts(models.Model):
    user = models.ForeignKey(UserProfile, null=True)
    title = models.CharField(max_length=150, default='')
    description = models.CharField(max_length=5000, default='')

forms.py

class ThoughtForm(ModelForm):
    class Meta:
        model = Thoughts
        fields = ['title', 'description']

views.py

@login_required(login_url='sign_in')
def add_thought(request):
    context = {}
    populateContext(request, context)

    user_details = UserProfile.objects.get(user=request.user)
    context.update(user_details=user_details)

    if request.method == 'POST':
    new_thought_form = ThoughtForm(request.POST)

        if new_thought_form.is_valid():
            new_thought_form.save()
            return HttpResponse('Hurray, saved!')
    else:
        new_thought_form = ThoughtForm()


    c = {'new_thought_form': new_thought_form,}
    c.update(csrf(request))

    return render_to_response('lala/add_new_thought.html', c)

每当我尝试添加" instance = user_details.id"时,它会说' int'对象没有属性' _meta'。有什么想法吗?

1 个答案:

答案 0 :(得分:7)

您可以通过删除UserProfile模型简化模型:

# models.py

class Thoughts(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=150, default='')
    description = models.CharField(max_length=5000, default='')

你的forms.py看起来不错。

更改您的观点:

# views.py     

@login_required(login_url='sign_in')
def add_thought(request):
    if request.method == 'POST':
        form = ThoughtForm(request.POST)
        if form.is_valid():
            thought = form.save(commit=False)
            thought.user = request.user
            thought.save()
            return HttpResponse('Hurray, saved!')
    else:
        form = ThoughtForm()
    return render(request, 'lala/add_new_thought.html', {
        'form': form
    })