Создание формы аутентифицированного пользователя, которую можно редактировать в 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(),
}