2013-04-04 2 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 в добавлении нового тега. Вы должны использовать 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

+0

Большое вам спасибо! – Modelesq

0

Я не знаю точно, что случилось с вашим кодом, но это не то, что вы шо uld делаю. Форматы Django обрабатывают все это для вас автоматически - создание формы, преобразование из данных post в данные python и сохранение модели. Они также делают много проверок, которые действительно очень полезны, что вы никогда не узнаете, как себя вести.

Пожалуйста, смотрите форму документации Django: https://docs.djangoproject.com/en/dev/topics/forms/

+0

К сожалению, я уже играл с формами django, ModelForms. И ни одна из них не подходит для задачи из-за формы, требующей скрытых входов, содержащих значение «Tag». – Modelesq

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_field, вы можете сделать slugify(request.POST['tag']) в get_or_create возвращает 2 параметров - один является объектом, а другой является created = True/False изобразить, если новый объект был создан

Кроме того, TagStatus.DoesNotExist никогда не будет происходить так вы используете get_or_create

+0

это фактически возвращает значение «Значение»: невозможно присвоить «u'internet»: «TagStatus.tag» должен быть экземпляром «Tag». «Я предполагаю, что это имеет какое-то отношение к' tag__slug'? – Modelesq

+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

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

Вам не нужно, чтобы добавить TagStatus.save()