2013-04-04 19 views
0

我试图保存我的TagStatus对象。现在它正在保存,但它不保存用户名,也不保存标签外键。Django对象不保存用户名与get_or_create()

请告诉我它的储蓄,现在是这样的:

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> 

回答

1

我不知道。如果您正在查询或保存,则必须使用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)) 
+0

'TagStatus.objects.create(status = status,tag = new_tag,user = user)'做了诀窍+'new_tag = Tag .objects.get(id = tag)' – Modelesq 2013-04-04 20:24:42

+0

非常感谢! – Modelesq 2013-04-04 20:24:59

0

我不知道到底出了什么问题与您的代码,但这不是你笑的他们正在做。 Django表单自动处理所有这些东西 - 创建表单,从发布数据转换为Python数据,并保存模型。他们也做了很多验证,这真的很有帮助,你永远不会知道如何去做自己。

请参阅Django的形式文档:https://docs.djangoproject.com/en/dev/topics/forms/

+0

不幸的是,我已经玩过django表单,ModelForms。由于表单需要隐藏输入来保存外键“标签”的值,因此它们都不适合该任务。 – Modelesq 2013-04-04 18:05:31

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() 

此外,tagTag实例,你可以这样做:

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

如果蛞蝓是slug_field,你可以做slugify(request.POST['tag'])get_or_create返回两个参数 - 一个是对象,另一个是因为绝不会发生created = True/False如果一个新的对象被创建

而且描绘,TagStatus.DoesNotExist您正在使用get_or_create

+0

这实际上返回一个'Value Error:Can not assign'u'internet'“:”TagStatus.tag“必须是一个”Tag“实例。”我假设它与'tag__slug'有关? – Modelesq 2013-04-04 18:22:20

+0

是的,这正是你应该传递一个标签对象的问题,而不是一个字符串,否则这个解决方案应该工作。您应该将标记对象保存在某处。 tag.slug = request.POST ['tag']; tag.save()然后TagStatus.objects.get_or_create(status = status,tag = tag,user = user,defaults = {'user':user,'tag':tag}) – dusual 2013-04-04 18:26:25

+0

对不起,我错过了。只是编辑了答案。 – 2013-04-04 18:29:35

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}) 

你不需要为什么你在添加新标签使用get_or_create添加TagStatus.save()

相关问题