Python 在Django中使用表单更新数据库行
我正试图用Django的表单更新数据库中的现有行。我创建新行没有问题,但是当我尝试更新现有行时,我得到了一个ValueError(在文章末尾回溯) 我知道我的“产品”属性被误认为是主键,但就是不明白为什么。这是我的密码: 型号.pyPython 在Django中使用表单更新数据库行,python,django,django-forms,Python,Django,Django Forms,我正试图用Django的表单更新数据库中的现有行。我创建新行没有问题,但是当我尝试更新现有行时,我得到了一个ValueError(在文章末尾回溯) 我知道我的“产品”属性被误认为是主键,但就是不明白为什么。这是我的密码: 型号.py class Rates(models.Model): my_id = models.AutoField(primary_key=True) product = models.CharField(unique=True, max_length=255)
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)
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'})
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})
forms.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)
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'})
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})
视图.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)
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'})
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})
回溯
回溯(最近一次呼叫最后一次):
文件“/home/您似乎在会话中保存了文本值“Product A”,而不是产品的实际ID。如果无法更改正在保存的内容,则需要基于该名称获取产品实例
但是,在您的视图中,您也在做一些非常奇怪的事情。您不应该重新实例化表单,所有那些清理的\u数据
行完全没有任何作用。另外,请注意缩进;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(...)
非常感谢!它解决了我的问题。也谢谢你给我的建议。