Обновление поля модели из Views.py - PullRequest
0 голосов
/ 28 апреля 2020

У меня такое ощущение, что мне не хватает чего-то очевидного и синтаксиса, связанного здесь, поэтому я заранее извиняюсь.

Я пытаюсь обновить статус пользователя, когда он успешно обрабатывает форму.

# Models.py
class Account(AbstractBaseUser):
    status_list = ( ('R',"RED"), ('B',"BLUE"), ('G',"GREEN"),)
    status = models.CharField(max_length=1, choices=status_list, default='R')
    value = models.CharField(max_length=30, unique=False, blank=True)



#Forms.py
class Form(forms.ModelForm):

    class Meta:
        model = Account
        fields = ('value', )



# Views.py
def View(request):

if request.POST:
    form = Form(request.POST, instance=request.user)
    if form.is_valid():
        form.initial = {"value": request.POST['value'],}
        form.save()
        #Here is the issue V
        Account.objects.filter(status=Account.status).update(status='B')
        return redirect('status')

Я испробовал решения, представленные в обоих этих постах:

1. Редактирование поля модели из Views.py

2. У объекта нет атрибута «update»

, а также множество других случайных и чрезмерно творческих комбинаций.

Кто-нибудь знает правильный синтаксис для этого вызова?

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Вам необходимо сохранить изменения в экземпляре Account, например,

def View(request):
  if request.POST:
      form = Form(request.POST, instance=request.user)
      if form.is_valid():
          form.initial = {"value": request.POST['value'],}
          form.save()

          a = Account.objects.get(user=request.user)
          a.update(status='B') 
          # or
          #a.status = 'B'
          a.save()
          return redirect('status')

, и, как указал @MarkLiang, filter возвращает QuerySet, а не один экземпляр Account.

1 голос
/ 28 апреля 2020

Account.objects.filter() вернет QuerySet вместо объекта Account. Вам нужно использовать get() или filter()[0], если вы знаете, что учетная запись существует; если вы не уверены, существует ли он, вы можете использовать get_or_create()

Если вы хотите обновить указанный c статус учетной записи текущего пользователя, вам нужно сделать следующее:

Шаг 1: получить учетную запись, которую вы хотите обновить

# you can get it by searching from Account
account = Account.objects.get(user=request.user)
# or you can can it directly from the request.uer
account = request.user.account

Шаг 2: Обновить поле

account.status = 'B' # set it to whatever you want to update
account.save() # you need to use save() because there is no update() in a model object

...