Создание формы аутентифицированного пользователя, которую можно редактировать в django

Я делаю медицинский сайт и хотел добавить функцию, с помощью которой пользователь мог бы добавить историю болезни в поле описания. Сайт отображает главную страницу только после того, как пользователь успешно вошел в систему. Поэтому я хотел сделать так, чтобы пользователь мог написать свою историю болезни, а когда в будущем он захочет что-то в ней изменить, он сможет отредактировать ее в том же поле описания, поскольку оно всегда показывает то, что вы отправили, и является одинаковым для пользователя. Но в моем случае, когда я отправляю данные, это просто создает новые описания.

#models.py

class History(models.Model):
user = models.ForeignKey(User,on_delete=models.CASCADE)
disc = models.TextField(blank=True)

#views.py

def history(request):

his = History(user = request.user)
form = HistoryForm(request.POST or None, instance=his)
if request.method == "POST":
    
    
    if form.is_valid():
        profile = form.save(commit=False)
        profile.user = request.user
        profile.save()
        
        return redirect('/index')


return render(request, 'history.html', {'form': form})

#urls.py

path('history', views.history, name='history'),

#forms.py

class HistoryForm(ModelForm):
class Meta:
    model = History
    fields = ('disc',)
    
    labels = {
        'disc' : 'History'
    }
    Widget = {
        'disc': forms.Textarea(attrs={'class': 'form-control', 'placeholder': 'Write your medical history here...'}),
    }

Кроме того, (attrs=....) не работает, ни класс, ни placeholder.

#history.html

    <form class="mx-5 mt-5" method="POST" action="">
    {% csrf_token %} {{form.as_p}}

    <button type="submit" class="btn btn-primary my-3">Submit</button>
  </form>

Сначала необходимо изменить

his = History(user = request.user)

to

his = History.objects.get(user=request.user)

Потому что то, что вы написали, это не запрос, это создание объекта History, и поэтому вы получаете новые описания.

Пример:

    his = History.objects.get(user=request.user)
    form = HistoryForm(request.POST or None, instance=his)

    if request.method == "POST":
        if form.is_valid():
            form.save()
            return redirect('/')

    return render(request, 'history.html', {'form': form})

Также вы можете удалить commit=False из form.save(commit=False).

Что касается attr, вы можете написать что-то вроде этого.

class HistoryForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['disc'].widget.attrs.update(
            {
                'class': 'form-control', 
                'placeholder': 'Write your medical history here...'
            }
        )

    class Meta:
        model = History
        fields = ('disc',)

        labels = {
            'disc': 'History'
        }
        Widget = {
            'disc': forms.Textarea(),
        } 
Вернуться на верх