Django: Динамическое и безопасное изменение значения формы из шаблона для цикла сохранения формы в базе данных
Итак, у меня есть база данных "stuff", которая по сути статична и не редактируется пользователями, это репозиторий вещей, которые пользователям разрешено сохранять. Однако пользователи могут сохранять копии этих вещей в отдельной базе данных "user_stuff", поскольку уникальные пользовательские вещи будут содержать данные, уникальные для каждого пользователя.
class public_stuff(models.Model):
name = models.CharField(max_length=100, unique=True)
description = models.TextField(blank=True)
def __str__(self):
return self.name
class user_stuff(models.Model):
name = models.CharField(max_length=100)
stuff = models.ForeignKey(public_stuff, on_delete=models.DO_NOTHING)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
description = models.TextField()
def __str__(self):
return self.name
На моей реальной странице я отображаю список всех публичных вещей (на данный момент у меня только две вещи в public_stuff в тестовых целях), а также список всех вещей пользователя. Для каждой записи публичного материала я бы хотел иметь кнопку, нажав на которую пользователь может "сохранить" копию этой записи в своем материале, но проблема в том, что я не уверен, как сделать это безопасно. Основная проблема заключается в том, что в идеале я бы хотел отображать каждую запись через длинный цикл, так как список будет динамическим как по размеру, так и по составу. В результате я пытаюсь найти безопасный способ генерировать начальные значения формы вне шаблона. Вот что у меня есть на данный момент. Он еще не включает никакого способа сохранения материала в базе данных, и в основном ограничивается только формой.
views.py:
def public_stuff_detail_view(request):
form = SaveToUserStuffForm(request.POST or None)
if form.is_valid():
form.save()
public_obj = public_stuff.objects.all() # temporary, unscalable
user_obj = user_stuff.objects.filter(user=request.user)
# user_obj = settings.AUTH_USER_MODEL.user_stuff_set.all()
context = {
'stuff': public_obj,
'user_stuff': user_obj,
'form': form
}
return render(request, "mystuff/mystuff_detail.html", context)
forms.py:
class SaveToUserStuffForm(forms.Form):
stuff_to_save = forms.CharField(label='stuff_to_save', max_length=100, )
mystuff_detail.html
{% extends 'base.html' %}
{% block content %}
{% for obj in stuff %}
<h1> {{ obj.name }} </h1>
<p> {{ obj.description }} </p>
<form method='POST'>
{% csrf_token %}
<button type='submit' name='SaveToUserStuffForm' value='{{ obj.name }}'> Save to My Stuff </button>
</form>
{% endfor %}
{% endblock %}
Я довольно новичок в веб-разработке, но я знаю достаточно, чтобы понять, что нечто подобное относительно небезопасно, а также является плохим пользовательским опытом, потому что при обновлении формы всегда будет всплывать окно подтверждения повторной отправки. Однако я также знаю, что не должен использовать GET-формы для вещей, которые сохраняются в базах данных. Как лучше всего подойти к этому вопросу?