[英]Updating a database row using form in Django
我正在嘗試使用Django的表單更新數據庫中的現有行。 創建新行沒有問題,但是當我嘗試更新現有行時,出現ValueError(帖子末尾的回溯)。
我知道我的“產品”屬性被誤認為是主鍵,但無法弄清楚原因。 這是我的代碼:
models.py
class Rates(models.Model):
my_id = models.AutoField(primary_key=True)
product = models.CharField(unique=True, max_length=255)
taux_comm_1 = models.FloatField(blank=True, null=True)
taux_comm_2 = models.FloatField(blank=True, null=True)
taux_euros = models.FloatField(blank=True, null=True)
taux_uc = models.FloatField(blank=True, null=True)
taux_prud = models.FloatField(blank=True, null=True)
forms.py
class RatesForm(forms.ModelForm):
class Meta:
model = Rates
fields = ['product', 'taux_comm_1', 'taux_comm_2', 'taux_euros', 'taux_uc', 'taux_prud']
labels = {
'product': "Nom du produit",
'taux_comm_1': "Taux de commission de production",
'taux_comm_2': "Taux de commission de portefeuille",
'taux_euros': "Taux de commission sur l'encours euros",
'taux_uc': "Taux de commission sur l'encours UC",
'taux_prud': "Taux de commission sur l'encours UC Prudentes",
}
def __init__(self, *args, **kwargs):
super(RatesForm, self).__init__(*args, **kwargs)
self.fields['product'].widget.attrs.update({'class': 'form-control', 'readonly':'readonly'})
self.fields['taux_comm_1'].widget.attrs.update({'class': 'form-control'})
self.fields['taux_comm_2'].widget.attrs.update({'class': 'form-control'})
self.fields['taux_euros'].widget.attrs.update({'class': 'form-control'})
self.fields['taux_uc'].widget.attrs.update({'class': 'form-control'})
self.fields['taux_prud'].widget.attrs.update({'class': 'form-control'})
views.py
product = request.session['product']
if request.method == 'POST':
rates_form = RatesForm(request.POST)
if rates_form.is_valid():
rate = Rates.objects.get(pk=2)
rates_form = RatesForm(instance=rate)
rates_form.cleaned_data.get('product')
rates_form.cleaned_data.get('taux_comm_1')
rates_form.cleaned_data.get('taux_comm_2')
rates_form.cleaned_data.get('taux_euros')
rates_form.cleaned_data.get('taux_uc')
rates_form.cleaned_data.get('taux_prud')
rates_form.save()
return redirect('/accountancy/rates/')
else:
search_form = SearchProduct()
rate = Rates.objects.get(pk=2)
rates_form = RatesForm(instance=rate, initial={'product': product})
追溯
Traceback (most recent call last):
File "/home/<3/.local/lib/python3.5/site-
packages/django/core/handlers/exception.py", line 35, in inner
response = get_response(request)
File "/home/<3/.local/lib/python3.5/site-
packages/django/core/handlers/base.py", line 128, in
_get_response
response = self.process_exception_by_middleware(e, request)
File "/home/<3/.local/lib/python3.5/site-
packages/django/core/handlers/base.py", line 126, in
_get_response
response = wrapped_callback(request, *callback_args,
**callback_kwargs)
File "/home/<3/.local/lib/python3.5/site-
packages/django/contrib/auth/decorators.py", line 21, in
_wrapped_view
return view_func(request, *args, **kwargs)
File "/home/<3/vsc-workspace/ola/ola/accountancy/views.py", line
109, in view_update_rate
'update': update,
File "/home/<3/.local/lib/python3.5/site-
packages/django/shortcuts.py", line 36, in render
content = loader.render_to_string(template_name, context,
request,
using=using)
File "/home/<3/.local/lib/python3.5/site-
packages/django/template/loader.py", line 62, in render_to_string
return template.render(context, request)
File "/home/<3/.local/lib/python3.5/site-
packages/django/template/backends/django.py", line 61, in render
return self.template.render(context)
File "/home/<3/.local/lib/python3.5/site-
packages/django/template/base.py", line 175, in render
return self._render(context)
File "/home/<3/.local/lib/python3.5/site-
packages/django/template/base.py", line 167, in _render
return self.nodelist.render(context)
File "/home/<3/.local/lib/python3.5/site-
packages/django/template/base.py", line 943, in render
bit = node.render_annotated(context)
File "/home/<3/.local/lib/python3.5/site-
packages/django/template/base.py", line 910, in render_annotated
return self.render(context)
File "/home/<3/.local/lib/python3.5/site-
packages/django/template/defaulttags.py", line 211, in render
nodelist.append(node.render_annotated(context))
File "/home/<3/.local/lib/python3.5/site-
packages/django/template/base.py", line 910, in render_annotated
return self.render(context)
File "/home/<3/.local/lib/python3.5/site-
packages/django/template/base.py", line 999, in render
return render_value_in_context(output, context)
File "/home/<3/.local/lib/python3.5/site-
packages/django/template/base.py", line 978, in
render_value_in_context
value = str(value)
File "/home/<3/.local/lib/python3.5/site-
packages/django/utils/html.py", line 380, in <lambda>
klass.__str__ = lambda self: mark_safe(klass_str(self))
File "/home/<3/.local/lib/python3.5/site-
packages/django/forms/boundfield.py", line 36, in __str__
return self.as_widget()
File "/home/<3/.local/lib/python3.5/site-
packages/django/forms/boundfield.py", line 118, in as_widget
**kwargs
File "/usr/local/lib/python3.5/dist-
packages/smart_selects/widgets.py", line 125, in render
available_choices = self._get_available_choices(self.queryset,
value)
File "/usr/local/lib/python3.5/dist-
packages/smart_selects/widgets.py", line 161, in
_get_available_choices
item = queryset.filter(pk=value).first()
File "/home/<3/.local/lib/python3.5/site-
packages/django/db/models/query.py", line 836, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "/home/<3/.local/lib/python3.5/site-
packages/django/db/models/query.py", line 854, in
_filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "/home/<3/.local/lib/python3.5/site-
packages/django/db/models/sql/query.py", line 1253, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "/home/<3/.local/lib/python3.5/site-
packages/django/db/models/sql/query.py", line 1277, in _add_q
split_subq=split_subq,
File "/home/<3/.local/lib/python3.5/site-
packages/django/db/models/sql/query.py", line 1215, in
build_filter
condition = self.build_lookup(lookups, col, value)
File "/home/<3/.local/lib/python3.5/site-
packages/django/db/models/sql/query.py", line 1085, in
build_lookup
lookup = lookup_class(lhs, rhs)
File "/home/<3/.local/lib/python3.5/site-
packages/django/db/models/lookups.py", line 18, in __init__
self.rhs = self.get_prep_lookup()
File "/home/<3/.local/lib/python3.5/site-
packages/django/db/models/lookups.py", line 68, in
get_prep_lookup
return self.lhs.output_field.get_prep_value(self.rhs)
File "/home/<3/.local/lib/python3.5/site-
packages/django/db/models/fields/__init__.py", line 947, in
get_prep_value
return int(value)
ValueError: invalid literal for int() with base 10: 'Product A'
Django追溯
__class__ <class 'django.db.models.fields.AutoField'>
self <django.db.models.fields.AutoField: id>
value 'Product A'
如果您有任何解決辦法,我將非常感謝您的幫助。
您似乎在會話中保存了文本值“ Product A”,而不是產品的實際ID。 如果您無法更改要保存的內容,則需要根據該名稱獲取產品實例。
但是您也認為自己在做一些非常奇怪的事情。 您不應該重新實例化表單,所有這些cleaned_data
行絕對不執行任何操作。 另外,請注意縮進; else
指向第一個if
,而不是第二個。
product = Product.objects.get(product_name=request.session['product']) # or whatever the name field is
rate = Rates.objects.get(pk=2)
if request.method == 'POST':
rates_form = RatesForm(request.POST, instance=rate)
if rates_form.is_valid():
rates_form.save()
return redirect('/accountancy/rates/')
else:
search_form = SearchProduct()
rates_form = RatesForm(instance=rate, initial={'product': product})
return render(...)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.