Проблема Django / Jquery - Невозможно назначить «u'Agua»: «Venta.producto» должен быть экземпляром «Producto» - PullRequest
1 голос
/ 09 июля 2011

Я использую виджет автозаполнения django + jquery в своем приложении. Я настроил форму администратора одной из моих таблиц, чтобы автозаполнение в текстовом поле ввода. Он работает за исключением того, что при сохранении формы возникает следующее исключение:

ValueError at /admin/Stock/venta/add/
Cannot assign "u'Agua'": "Venta.producto" must be a "Producto" instance.
Request Method: POST
Request URL:    http://127.0.0.1:8080/admin/Stock/venta/add/
Exception Type: ValueError
Exception Value:    
Cannot assign "u'Agua'": "Venta.producto" must be a "Producto" instance.
Exception Location: /usr/lib/pymodules/python2.6/django/db/models/fields/related.py in __set__, line 273
Python Executable:  /usr/bin/python
Python Version: 2.6.5
...

Кажется, это не преобразовывает мой автозаполненный текст в объект Producto. Я увидел сообщение POST, и оно отправляет цифровой ключ (т. Е. 2) выбранного продукта. Когда я отключил все вещи автозаполнения, пост точно такой же, но он работает. Поэтому что-то из исходного кода admin.py или models.py неверно. Затем что-то делает это в случае, если он преобразует его в объект, а не в другой.

Ниже приведена models.py часть:

class Producto(models.Model):
        detalle = models.CharField('Detalle', max_length=200)
        importe = models.FloatField('Importe')
        def __unicode__(self):
                return self.detalle

class Empleado(models.Model):
        nombre = models.CharField('Nombre', max_length=100)
        def __unicode__(self):
                return self.nombre

class Venta(models.Model):
        importe = models.FloatField('Importe')
        producto = models.ForeignKey(Producto)
        responsable = models.ForeignKey(Empleado)
        mesa = models.IntegerField()

Ниже приведена admin.py часть:

class VentaAdminForm(forms.ModelForm):
        importe = forms.DecimalField()
        producto = forms.CharField()
        responsable = forms.CharField()
        mesa = forms.IntegerField()
        class Meta:
                model = Venta
                fields = ['producto', 'importe', 'responsable', 'mesa']

class VentaAdmin(admin.ModelAdmin):
        form = VentaAdminForm

admin.site.register(Venta, VentaAdmin)

views.py

@login_required
def search(request):
   results = []
   if request.method != "GET":
      return HttpResponse()

   term = q = None
   if request.GET.has_key(u'q'):
      q = request.GET[u'q']
   if request.GET.has_key(u'term'):
      term = request.GET[u'term']
   if not q or not term:
      return HttpResponse()

   if q == 'producto':
      model_results = Producto.objects.filter(detalle__contains=term)
      for x in model_results:
         results.append({'label': x.detalle,'value': x.detalle, 'id': x.id })
   elif q == 'responsable':
      model_results = Empleado.objects.filter(nombre__contains=term)
      for x in model_results:
         results.append({'label': x.nombre,'value': x.nombre, 'id': x.id })
   else:
         raise Exception("Unknown query_object")
   json = simplejson.dumps(results)
   return HttpResponse(json, mimetype='application/json')

Часть JavaScript:

<script>
$(function() {
        $( "#id_producto" ).autocomplete({
                source: "/search/?q=producto",
        });
        $( "#id_responsable" ).autocomplete({
                source: "/search/?q=responsable",
        });
});
</script>

Когда запись, т. Е. Агуа, в текстовое поле автозаполнения отправляет GET, и ответ следующий:

http://127.0.0.1:8080/search/?q=producto&term=agua

[{"id": 3, "value": "Agua", "label": "Agua"}]

версия

django 1.1.1
jquery 1.5.1
jquery-ui 1.8.13

Ответы [ 2 ]

0 голосов
/ 09 июля 2011
producto = models.ForeignKey(Producto)

В определении модели Venta вы определили producto как иностранный ключ, что означает, что при сохранении формы django ожидает, что получит идентификатор связанного объекта (в этой ситуации idсоответствующей записи producto ), а не метки записи.

Django использует поле со списком для таких внешних ключей с выводом html, например:

<select name='producto'>
    <option value='3'>Agua</option>
    ...

Есливы отображаете это поле как raw_id_field ( документация ), django отобразит id объекта и запишет значение Unicode рядом с полем.

Таким образом, вы должны передать идентификатор связанного объекта , а не имя или строку Юникода.Я не использую виджет автозаполнения, но должен быть правильный способ сделать это правильно.

0 голосов
/ 09 июля 2011

Похоже, "Agua" - это значение, которое передается обратно вашему контроллеру, тогда как Rails ожидает, что вы передадите "3". Можете ли вы попробовать изменить свой бэкэнд для отправки

[{"value": "3", "label": "Agua"}]

и посмотрите, работает ли

...