Задать вопрос
@zagogulka

Как правильно реализовать редактирование записи в БД django с помощью форм?

Я пытаюсь реализовать редактирование записи в БД django с помощью формы.
Перепробовал много разных вариантов, приведенных в интернете, но ни один не сработал.
В чем у меня ошибка?

Класс, реализующий форму:

class SluzebkaSnabForm(forms.ModelForm):
    class Meta:
        model = SluzSnab
        fields = ['sls_manage1', 'sls_date1', 'sls_vyp1', 'sls_manage2', 'sls_date2', 'sls_vyp2']
        widgets = {
            # 'sls_date': forms.DateInput(format='%d.%m.%Y', attrs={
            #     'readonly': 'readonly',
            #     'class': 'sl_name',
            #     'size': '50'
            # }),
            'sls_manage1': forms.Select(),
            'sls_date1': forms.DateInput(format='%d.%m.%y'),
            'sls_vyp1': forms.Select(),
            'sls_manage2': forms.Select(),
            'sls_date2': forms.DateInput(format='%d.%m.%y'),
            'sls_vyp2': forms.Select(),
        }


Модель:
class SluzSnab(models.Model):
    sls_date = models.DateField('Дата создания служебной записки', blank=True, null=True)
    sls_no = models.CharField(max_length=20, verbose_name='Номер служебной записки')
    sls_zak = models.CharField(max_length=20, verbose_name='Номер заказа')
    sls_kol = models.IntegerField(verbose_name='Количество изделий')
    sls_con_choice = [
        ('ivanov', 'Иванов'),
        ('petrov', 'Петров'),
    ]
    sls_con = models.CharField(max_length=20, choices=sls_con_choice, verbose_name='Ответственный конструктор')
    sls_stat = [
        ('vyp', 'Выполнено'),
        ('nevyp', 'Не выполнено'),
    ]
    sls_ei_choice = [
        ('sht', 'Штуки'),
        ('kg', 'Килограммы'),
    ]
    sls_meneg_choice = [
        ('pantushin', 'Пантюшин'),
        ('admin', 'Комиссаров А.В.'),
    ]
    sls_name1 = models.CharField(max_length=500, verbose_name='Позиция1', blank=True, null=True)
    sls_ed1 = models.CharField(max_length=20, choices=sls_ei_choice, verbose_name='Единицы измерения', blank=True, null=True)
    sls_kol1 = models.IntegerField(verbose_name='Количество', blank=True, null=True)
    sls_vsego1 = models.IntegerField(blank=True, null=True, verbose_name='Всего (на заказ)')
    sls_manage1 = models.CharField(max_length=200, choices=sls_meneg_choice, verbose_name='Ответственный менеджер', blank=True, null=True)
    sls_date1 = models.DateField('Дата поставки', blank=True, null=True)
    sls_vyp1 = models.CharField(max_length=20, choices=sls_stat, verbose_name='Отметка о выполнении', blank=True, null=True)
    sls_name2 = models.CharField(max_length=500, verbose_name='Позиция2', blank=True, null=True)
    sls_ed2 = models.CharField(max_length=20, choices=sls_ei_choice, verbose_name='Единицы измерения', blank=True, null=True)
    sls_kol2 = models.IntegerField(verbose_name='Количество', blank=True, null=True)
    sls_vsego2 = models.IntegerField(blank=True, null=True, verbose_name='Всего (на заказ)')
    sls_manage2 = models.CharField(max_length=200, choices=sls_meneg_choice, verbose_name='Ответственный менеджер', blank=True, null=True)
    sls_date2 = models.DateField('Дата поставки', blank=True, null=True)
    sls_vyp2 = models.CharField(max_length=20, choices=sls_stat, verbose_name='Отметка о выполнении', blank=True, null=True)


Вьюха:

login_required(redirect_field_name='login')
def sluzebki(request):
    sluz_snab = SluzSnab.objects.order_by('-sls_no')
    # sluz_snab = SluzSnab.objects.order_by('-sls_no')
  
    return render(request, 'sluzebki.html', {'sluz': sluz_snab})

@login_required(redirect_field_name='login')
def sluzwno(request, pk):
    sluz = get_object_or_404(SluzSnab, pk=pk)
    # sluz = SluzSnab.objects.get(id=sid)
    if request.method == 'POST':
        sform = SluzebkaSnabForm(request.POST, instance=sluz)
        if sform.is_valid():
            sluz = sform.save(commit=False)
            sluz.save()
            # messages.success(request, 'Настройки успешно обновлены!')
            return redirect('sluzwno', pk=sluz.pk)
    else:
        sform = SluzebkaSnabForm(instance=sluz)
    return render(request, 'sluzwno.html', {'sluz': sluz, 'sform': sform})


template:

{% extends 'base.html' %}
{% block title %}Служебка №{{ sluz.0.sls_no }}{% endblock %}
{% block body %}
    <div class="line_links">
       / <a href="{% url 'zurnaly' %}">служебное</a> / <a href="{% url 'sluzebki' %}">Служебные записки</a> /
        <a href="{% url 'sluzwno' pk=sluz.pk %}">{{ sluz.sls_no }}</a>
    </div>
    <form action="{% url 'sluzwno' pk=sluz.pk %}" name="sluz">
        {% csrf_token %}

        {{ sform.non_field_errors }}
        {{ sform.as_p }}
        <button type="submit">Добавить запись в журнал</button>
    </form>
{% endblock %}
  • Вопрос задан
  • 1554 просмотра
Подписаться 2 Простой 1 комментарий
Решения вопроса 1
@zagogulka Автор вопроса
Всем спасибо за помощь! Я сам нашел свою ошибку: необходимо было в шаблоне в теге поставить method="post"
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы