2016-08-03 3 views
2

Ich habe eine Model mit einer UUID als PK.Benötigen Sie ein nicht bearbeitbares Feld in POST-Daten, aber ModelForm lässt mich nicht

class Product(models.Model): 
    uuid = models.UUIDField(
     primary_key=True, 
     default=uuid.uuid4, 
     editable=False) 

Ich brauche ein paar andere Felder zu bearbeiten, um eine ModelForm verwenden und müssen die UUID in den POST-Daten vorzulegen, um die Product zu identifizieren. Im Moment bekomme ich:

django.core.exceptions.FieldError: 'uuid' cannot be specified for Product model form as it is a non-editable field 

Offensichtlich konnte ich das Feld nicht editierbar machen, um schnell dies zu lösen ein mit ihm getan werden. Es scheint mir jedoch, dass die Verweigerung des Schreibzugriffs auf dieses Feld auf einer niedrigeren Logikebene erfolgen sollte als eine ModelForm (d. H. Ich denke, dass eine Ausnahme ausgelöst werden sollte, wenn versucht wird, sie stattdessen zu bearbeiten). Ist es möglich, dies stattdessen zu tun?

Edit: hygienisiert Zurückverfolgungs

File "/webapps/myapp/urls.py", line 6, in <module> 
    from my_app import views 
    File "/webapps/myapp/views/__init__.py", line 2, in <module> 
    from .my_view import MyView 
    File "/webapps/myapp/views/my_view.py", line 12, in <module> 
    from my_app.forms import ProductForm 
    File "/webapps/myapp/forms.py", line 5, in <module> 
    class ProductForm(forms.ModelForm): 
    File "/webapps/myapp/lib/python3.5/site-packages/django/forms/models.py", line 242, in __new__ 
    opts.field_classes) 
    File "/webapps/myapp/lib/python3.5/site-packages/django/forms/models.py", line 138, in fields_for_model 
    f.name, model.__name__) 
django.core.exceptions.FieldError: 'uuid' cannot be specified for Product model form as it is a non-editable field 

Und Formularcode:

class ProductForm(forms.ModelForm): 
    uuid = forms.UUIDField(required=False, widget=forms.HiddenInput()) 
+0

Sie müssen den tatsächlichen Code zu erhalten, die ist Auslösen dieser Ausnahme und des vollständigen Tracebacks. –

+0

Ok, ich habe den Formularcode und den Traceback hinzugefügt (um das Lesen zu erleichtern). – Escher

+0

Ich verstehe nicht, warum Sie das Feld in der Form überhaupt wollen. Wie in vd1 gezeigt, benötigen Sie zum Aktualisieren einer vorhandenen Instanz, an die Sie die Instanz übergeben, keine ID. –

Antwort

1

instance argument der Form angeben zu bestehenden Objekts zu ändern:

def edit_product(request, uuid): 
    product = get_object_or_404(Product, uuid=uuid) 
    ... 
    if request.method == 'POST': 
     form = ProductForm(request.POST, instance=product) 
     if form.is_valid(): 
      form.save() 
      ...