Django对象没有使用get_or_create()保存用户名

时间:2013-04-04 17:56:29

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

我正在尝试保存我的TagStatus对象。现在它正在保存,但它没有保存用户名,也没有保存标记外键。

现在它的储蓄是这样的:

user : __________ (empty) 
status : Status 2 
tag : _________ (empty)

我做错了什么?为什么不保存用户名或标签?提前感谢您的帮助。

模特:

class TagStatus(models.Model):
    user = models.ForeignKey(User, null=True, unique=True)
    status = models.CharField(max_length=2, choices=tag_statuses)
    tag = models.ForeignKey(Tag, null=True, blank=True)

    def __unicode__(self):
        return self.status

    def save(self, *args, **kwargs):
        super(TagStatus, self).save(*args, **kwargs)

我的观点:

@login_required
def tags(request):
    all_tags = Tag.objects.all()
    context = base_context(request)
    if request.method == 'POST':
        if 'status_check' in request.POST:
            status = int(request.POST['select'])
            tag = request.POST['tag']
            user = request.user
            try:
                tag_status = TagStatus.objects.get_or_create(status=status, tag__slug=tag, user__username=user.username)
            except TagStatus.DoesNotExist:
                tag_status = None
            response = simplejson.dumps({"status": "Successfully changed status"})
        else:
            response = simplejson.dumps({"status": "Error"})
            return HttpResponse (response, mimetype='application/json')
    status_form = TagStatusForm()
    context['all_tags'] = all_tags
    return render_to_response('tags/tags.html', context, context_instance=RequestContext(request))

模板:

<form class="nice" id="status-form" method="POST" action="">
     {% csrf_token %}
     <input type="hidden" name="status_check" />
     <input type='hidden' name="tag" value="{{ tag.slug }}" />
     <select name="select" id="positionSelect" class="input-text category" onchange="this.form.submit()">
          <option name="all" value="0">Your Status</option>
          <option name="investing" value="1">Status 1</option>
          <option name="selling" value="2">Status 2</option>
          <option name="interested" value="3">Status 3</option>
     </select>
</form>

4 个答案:

答案 0 :(得分:3)

你需要这样做: 变化:

tag_status = TagStatus.objects.get_or_create(status=status, tag__slug=tag, user__username=user.username)

为:

tag_status, _ = TagStatus.objects.get_or_create(status=status, tag=tag, user=user, defaults={'user': user, 'tag': tag})
tag_status.save()

此外,tag应为Tag个实例,您可以这样做:

tag, _ = Tag.objects.get_or_create(slug=request.POST['tag'])

如果slug是slug_field,你可以slugify(request.POST['tag']) get_or_create返回2个参数 - 一个是对象,另一个是created = True/False来描述是否创建了新对象

此外,由于您使用的是TagStatus.DoesNotExist

,因此get_or_create永远不会发生

答案 1 :(得分:1)

我不知道你为什么在添加新标签时使用get_or_create。如果您正在进行查询或保存,则必须使用get_or_create。我在你看来看到的是你只是添加它,没有查询。那么,如果你能把它变得困难,为什么你会这么做呢,

new_tag = Tag.object.create(slug=tag)
TagStatus.objects.create(status=status, tag=new_tag, user=user)

这将解决您的问题。

@login_required
def tags(request):
    all_tags = Tag.objects.all()
    context = base_context(request)
    if request.method == 'POST':
        if 'status_check' in request.POST:
            status = int(request.POST['select'])
            tag = request.POST['tag']
            user = request.user

            new_tag = Tag.object.create(slug=tag)
            TagStatus.objects.create(status=status, tag=new_tag, user=user)

            response = simplejson.dumps({"status": "Successfully changed status"})
        else:
            response = simplejson.dumps({"status": "Error"})
            return HttpResponse (response, mimetype='application/json')
    status_form = TagStatusForm()
    context['all_tags'] = all_tags
    return render_to_response('tags/tags.html', context, context_instance=RequestContext(request))

答案 2 :(得分:0)

我不确定你的代码究竟出了什么问题,但这不是你应该做的。 Django表单会自动处理所有这些内容 - 表单的创建,从post数据到python数据的转换以及保存模型。他们还进行了大量的验证,这些验证确实非常有用,你永远无法弄明白自己如何做。

请参阅Django表单文档:https://docs.djangoproject.com/en/dev/topics/forms/

答案 3 :(得分:0)

从@ user2246087延伸回答只需添加以下内容:

tag.slug = request.POST['tag']
tag.save()

然后

tag_status, created = TagStatus.objects.get_or_create(status=status, tag=tag, user=user, defaults={'user': user, 'tag': tag})

您无需添加TagStatus.save()