Обновите данные вместо создания новой записи строки в модели Django - PullRequest
0 голосов
/ 26 августа 2018

У меня есть страница для редактирования существующих данных из модели.

Модель:

class billitem(models.Model):
    code = models.AutoField(primary_key=True, unique=True)
    name = models.CharField(max_length=35)
    description = models.CharField(max_length=60, null=True)
    price = models.DecimalField(decimal_places=2, max_digits=8)

Форма:

class BillItem(forms.Form):
    code = forms.IntegerField(max_value=100000, disabled=True)
    name = forms.CharField(label='Item Name', max_length=32)
    description = forms.CharField(
        label='Description', max_length=57, required=False)
    price = forms.DecimalField(decimal_places=2, max_digits=8)

Вид:

def edit_bill_item(request, itemcode):
    if request.method == 'POST':
        form = BillItem(request.POST)
        code = request.POST.get('code')
        name = request.POST.get('name').title()
        description = request.POST.get('description')
        price = request.POST.get('price')
        billitem.objects.filter(code=code).update(
            name=name, description=description, price=price)
        msg = 'Successfully saved Billing item.'
        # form = BillItem(request.POST)
        return render(request, 'billing/edititem.html', {'form': form, 'msg': msg})
    else:
        itemcode = int(itemcode)
        item = get_object_or_404(billitem, code=itemcode)
        form = BillItem(initial={
            'code': item.code,
            'name': item.name,
            'description': item.description,
            'price': item.price
        })
        return render(request, 'billing/edititem.html', {'form': form})

Проблема в том, что каждый раз при отправке POST в таблицу добавляется другая запись с новым кодом вместо обновления существующей строки.

Я тоже пробовал:

item = billitem(code=code, name=name, description=description, price=price)
item.save()

Alternate:

class BillItem(ModelForm):
    class Meta:
        model = billitem
        fields = ['code', 'name', 'description', 'price']


def edit_bill_item(request, itemcode):
    if request.method == 'POST':
        code = request.POST.get('code')
        name = request.POST.get('name').title()
        description = request.POST.get('description')
        price = request.POST.get('price')
        item = billitem.objects.get(code=code)
        form = BillItem(request.POST, instance=item)
        form.save()
        msg = 'Successfully saved Billing item.'
        return render(request, 'billing/edititem.html', {'form': form, 'msg': msg})
    else:
        itemcode = int(itemcode)
        item = get_object_or_404(billitem, code=itemcode)
        form = BillItem(initial={
            'code': item.code,
            'name': item.name,
            'description': item.description,
            'price': item.price
        })
        return render(request, 'billing/edititem.html', {'form': form})

Который также имел тот же эффект. Как я могу справиться с обновлением существующих данных только внутри моей модели и формы.

1 Ответ

0 голосов
/ 26 августа 2018

Измените эту строку:

billitem.objects.filter(code=code).update(name=name, description=description, price=price)

Для использования встроенной функции update_or_create (https://docs.djangoproject.com/en/dev/ref/models/querysets/#update-or-create)

BillItem.objects.update_or_create(code=code, defaults={'name':'name', 'description':'description', 'price':'price})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...