0

我正在尝试保存我的 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

4 回答 4

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'])

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

此外,TagStatus.DoesNotExist因为您正在使用,所以永远不会发生get_or_create

于 2013-04-04T18:03:02.060 回答
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))
于 2013-04-04T19:13:53.490 回答
0

我不确定你的代码到底有什么问题,但这不是你应该做的。Django 表单会自动为您处理所有这些事情——表单的创建、从 post 数据到 python 数据的转换,以及保存模型。他们还做了大量的验证,这些验证真的很有帮助,你永远不会弄清楚如何去做。

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

于 2013-04-04T18:00:30.007 回答
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()

于 2013-04-04T18:12:22.783 回答