В 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].

Вернуться на верх