Python 在Django中使用表单更新数据库行

Python 在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)

我正试图用Django的表单更新数据库中的现有行。我创建新行没有问题,但是当我尝试更新现有行时,我得到了一个ValueError(在文章末尾回溯)

我知道我的“产品”属性被误认为是主键,但就是不明白为什么。这是我的密码:

型号.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})
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(...)

非常感谢!它解决了我的问题。也谢谢你给我的建议。