В Django, как я могу иметь функцию, в которой я могу только обновить значение, а не создавать новый экземпляр?
Например, у меня есть функция в файле views.py для публикации информации о наличии еды. Однако я не хочу, чтобы пользователь постоянно создавал новые экземпляры доступной еды. Я хочу, чтобы пользователь мог только обновлять это значение. Сейчас я ограничил пользователя только созданием экземпляра доступности еды, а затем не позволяю ему создавать другие экземпляры. Однако я не хочу, чтобы это было так; я хочу, чтобы пользователь мог просто обновлять это число.
Вот что я имею сейчас:
def check_existing_post(request):
data = request.POST.copy()
data["author"] = request.user
if len(Food_Avail.objects.filter(author=request.user)) > 0:
return False
else:
return True
def post_available_food(request):
instance = Food_Avail()
data = request.POST.copy()
data["author"] = request.user
form = FoodAvailForm(data or None, instance=instance)
if request.POST and form.is_valid() and check_existing_post(request):
form.save()
return HttpResponseRedirect(reverse("accounts:home"))
else:
messages.info(
request, "food availability by restaurant has already been posted!"
)
return render(request, "food_avail/post_food_avail.html", {"food": form})
Вы можете получить объект, принадлежащий этому пользователю, и передать его как instance=…
в форму:
from django.shortcuts import get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
@login_required
def post_available_food(request):
instance = get_object_or_404(Food_Avail, author=request.user)
if request.method == 'POST':
form = FoodAvailForm(request.POST, request.FILES, instance=instance)
if form.is_valid():
form.save()
return redirect('accounts:home')
else:
form = FoodAvailForm(instance=instance)
)
return render(request, 'food_avail/post_food_avail.html', {'food': form})
Примечание: Модели в Django пишутся в PascalCase, а не snake_case, поэтому вы можете переименовать модель из
вFood_Avail
FoodAvail
.
Примечание: Вы можете ограничить представления для аутентифицированных пользователей с помощью декоратора
@login_required
декоратора [Django-doc].