2016-12-27 11 views
0

Für eine Inventurschnittstelle möchte ich, dass ein Benutzer eine Dezimalzahl für neue Mengen auf Lager einfügt. Mit diesem Dezimalwert wird eine Transaktion ausgegeben, die den Artikel aus der Bestandsaufnahme auf den tatsächlichen Wert setzt, indem er die Differenz addiert.So erstellen Sie eine klassenbasierte Ansicht mithilfe eines benutzerdefinierten Formulars, um eine Aktion für ein Objekt auszuführen

zu tun yo Ich habe das Dezimalsystem

views.py zum Einsetzen einer Ansicht bietet nur ein Feld hinzugefügt:

class StorageItemStockTakingView(FormView): 
    form_class = StockTakingForm 
    success_url = reverse_lazy('storage_item_list') 
    template_name = 'pmgmt/storageitem/stocktaking.html' 

    def form_valid(self, form): 
     si = StorageItem.objects.get(pk=self.kwargs["pk"]) 
     si.stock_report(
      Decimal(self.request.POST["amount"]), self.request.user) 
     return super(StorageItemStockTakingView, self).form_valid(form) 

basierend auf einem benutzerdefinierten Formular innerhalb forms.py

class StockTakingForm(forms.Form): 
    amount = forms.DecimalField(
     _("Parts now inside storage"), 
     max_digits=10, 
     decimal_places=4, 
     help_text=_("The amount of currently inside storage place.")) 

Die verwendete Vorlage ist leise einfach:

{% extends "base.html" %} 

{% load i18n %} 
{% load semanticui %} 

{% block content %} 
<h1>{{ object }}</h1> 
<p>{% trans "It will create an Transaction adjusting the amount for items on stock to reported one.." %}</p> 
<form method="post" class="ui form segment"> 
    {% csrf_token %} 
    {{ form|semanticui }} 
    <input class="ui button blue" type="submit" value="Submit"> 
</form> 
{% endblock %} 

Das hat mit Python2 funktioniert. Aber wenn ich mit diesem auf Python3 Ich erhalte einen Fehler

2016-12-27 19:17:57,206 django.request 24760 Thread-2 ERROR Internal Server Error: /pmgmt/storageitem/1/stocktaking/ 
Traceback (most recent call last): 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/core/handlers/base.py", line 149, in get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/core/handlers/base.py", line 147, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view 
    return view_func(request, *args, **kwargs) 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/views/generic/base.py", line 68, in view 
    return self.dispatch(request, *args, **kwargs) 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/views/generic/base.py", line 88, in dispatch 
    return handler(request, *args, **kwargs) 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/views/generic/edit.py", line 221, in post 
    if form.is_valid(): 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/forms/forms.py", line 161, in is_valid 
    return self.is_bound and not self.errors 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/forms/forms.py", line 153, in errors 
    self.full_clean() 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/forms/forms.py", line 362, in full_clean 
    self._clean_fields() 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/forms/forms.py", line 380, in _clean_fields 
    value = field.clean(value) 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/forms/fields.py", line 168, in clean 
    self.run_validators(value) 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/forms/fields.py", line 151, in run_validators 
    v(value) 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/core/validators.py", line 310, in __call__ 
    if self.compare(cleaned, self.limit_value): 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/core/validators.py", line 324, in <lambda> 
    compare = lambda self, a, b: a > b 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/utils/functional.py", line 148, in __lt__ 
    return self.__cast() < other 
TypeError: unorderable types: str() < decimal.Decimal() 
2016-12-27 19:17:57,206 django.request 24760 Thread-2 ERROR Internal Server Error: /pmgmt/storageitem/1/stocktaking/ 
Traceback (most recent call last): 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/core/handlers/base.py", line 149, in get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/core/handlers/base.py", line 147, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view 
    return view_func(request, *args, **kwargs) 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/views/generic/base.py", line 68, in view 
    return self.dispatch(request, *args, **kwargs) 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/views/generic/base.py", line 88, in dispatch 
    return handler(request, *args, **kwargs) 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/views/generic/edit.py", line 221, in post 
    if form.is_valid(): 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/forms/forms.py", line 161, in is_valid 
    return self.is_bound and not self.errors 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/forms/forms.py", line 153, in errors 
    self.full_clean() 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/forms/forms.py", line 362, in full_clean 
    self._clean_fields() 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/forms/forms.py", line 380, in _clean_fields 
    value = field.clean(value) 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/forms/fields.py", line 168, in clean 
    self.run_validators(value) 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/forms/fields.py", line 151, in run_validators 
    v(value) 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/core/validators.py", line 310, in __call__ 
    if self.compare(cleaned, self.limit_value): 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/core/validators.py", line 324, in <lambda> 
    compare = lambda self, a, b: a > b 
    File "/home/frlan/quellen/partuniverse/p3/lib/python3.5/site-packages/django/utils/functional.py", line 148, in __lt__ 
    return self.__cast() < other 
TypeError: unorderable types: str() < decimal.Decimal() 

Also ich frage mich, was ist der richtige Weg, der in einem klassenbasierten Ansicht Zusammenhang mit dem jüngsten Django-Versionen so etwas wie dies zu tun?

+1

Dies ist nicht die Quelle des Fehlers, die ich sehe, ist jetzt identifiziert worden, aber ich persönlich würde verwenden ' form.cleaned_data ['amount'] 'als arg zu' si.stock_report' anstelle von 'Decimal (self.request.POST [" amount "])'. –

Antwort

2

Das erste Positionsargument zu einem forms.DecimalField ist nicht die Bezeichnung, sondern der maximale Wert - deshalb beschwert sich der Fehler über den Vergleich einer Zeichenkette (dieser Wert) mit einem int (dem tatsächlichen Wert des Feldes).

Generell sollten Sie nicht verwenden Positions args mit Formularfeldklassen - Einsatz kwargs konsequent:

amount = forms.DecimalField(
    label=_("Parts now inside storage"), 
    ...) 
Verwandte Themen