2011-07-09 9 views
1

私のアプリケーションではdjango + jqueryオートコンプリートウィジェットを使用しています。私は自分のテーブルの1つの管理フォームをカスタマイズして、入力テキストボックスにオートコンプリートを得ました。私は次の例外が発生し、フォームを保存するとき これは、ことを除いて働いています:Django/Jqueryの問題 - "u'Agua 'を割り当てることができません" Venta.producto "は" Producto "インスタンスでなければなりません

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を見て、選択されたProductoの数値キー(すなわち、2)を送信しています。オートコンプリートのすべてを無効にすると、投稿はまったく同じですが動作します。ですから、admin.pyやmodels.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') 

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一部である:

は以下models.py一部であります

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 =アグア&用語

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

バージョン

django 1.1.1 
jquery 1.5.1 
jquery-ui 1.8.13 

答えて

0

その値はあなたのコントローラに戻されますが、Railsはあなたに "3"を渡すことを期待しています。それはあなたのベンタモデル定義では

+1

Rails? _Python_ではなく_Ruby_です。とにかく、それは動作しません、数値(プライマリキー)が_value_にある場合、それはコンボボックスのドロップダウン(他の1. 2。3。4の1つ下に表示されます)を選択すると、テキスト、つまり_Agua_がテキストボックスに表示されます。次に_value_はコンボボックスのオプションで、ラベルは選択用ですが、返信するように変更した場合、「値」:「Agua」、「ラベル」:2、...」がドロップボックスに表示されます私が1つを選択すると、選択テキストボックスにnumbre(プライマリーキー)が表示されます。 – Tavo

0
producto = models.ForeignKey(Producto) 

を動作するかどうか、あなたが

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

を送信して見るためにあなたのバックエンドを変更してみてください、あなたは意味のForeignKey、フォームを保存し、ジャンゴとproductoを定義しは、がレコードのラベルではなく、関連するオブジェクトのID(この場合、関連するの製品IDレコードのID)を取得することを期待しています。

DjangoはのようなHTML出力では、そのようなのForeignKeyのためのコンボボックスを使用しています:documentation)をraw_id_fieldとして、あなたがそのフィールドをsdisplay場合、Djangoは、オブジェクトのIDが表示されます

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

フィールドの近くにユニコード値を書き込んでください。

したがって、には、名前またはユニコード文字列ではなく、関連オブジェクトのIDを渡す必要があります。私はオートコンプリートウィジェットを使いませんが、正しく行うには適切な方法が必要です。

関連する問題