Изменяет значения по умолчанию после UpdateView - PullRequest
0 голосов
/ 24 марта 2019

Прежде всего, мои извинения за ошибки в английском.
У меня есть три модели: книги (общая модель), BookInfo (информация о книге), местоположение (позиция в библиотеке) с внешним ключом.

models.py

class Location(models.Model):
    room = models.PositiveIntegerField()
    bookcase = models.PositiveIntegerField()
    shelf = models.PositiveIntegerField()


class BookInfo(models.Model):
    title = models.CharField(max_length=120)
    author = models.CharField(max_length=150)
    published = models.CharField(max_length=4)
    position = models.ForeignKey(Location, on_delete = models.CASCADE, related_name = 'position_information')

    def __str__(self):
        return self.title
    class Meta:
        ordering = ['-id']
        unique_together = ['title', 'author']


class Books(models.Model):

    ON_HANDS = 1
    IN_LIBRARY = 0
    ALARM = -1

    STATUS = (
        (ON_HANDS, 'The book is on hands'),
        (IN_LIBRARY, 'The book is in library'),
        (ALARM, 'Need to return the book')
    )

    book = models.ForeignKey('BookInfo', on_delete = models.CASCADE, related_name = 'book_information')
    date_of_issue = models.DateField(blank= True, default=timezone.now)
    date_of_return = models.DateField(blank= True, default=date.today() + timedelta(days=14))
    status_of_book = models.IntegerField(choices = STATUS, default = 0)

    def __str__(self):
        return self.book.title

    class Meta:
        ordering = ['-id']

forms.py

    class BookFormUpdate(forms.ModelForm):
        class Meta:
            model = Books

            fields = ['book','date_of_issue','date_of_return','status_of_book']
            widgets = {
                'date_of_issue': forms.DateInput(format=('%Y-%m-%d'), attrs={'class':'form-control', 'placeholder':'Select a date', 'type':'date'}),
            'date_of_return': forms.DateInput(format=('%Y-%m-%d'), attrs={'class':'form-control', 'placeholder':'Select a date', 'type':'date'})
            }

Когда я использую форму обновления для книг и меняю статус книги на 1 или -1, я хочу автоматически изменить позицию книги на (0,0,0). Я перезаписал свой UpdateView, но у меня возникли проблемы.

views.py

class MainUpdate(UpdateView):  
    model = Books
    template_name = 'core/detail.html'
    form = BookFormUpdate

    def form_valid(self, form):
        form.save()
        categories = get_object_or_404(self.model, pk=self.kwargs.get('pk'))
        stat = form.cleaned_data['status_of_book']
        if stat == 1 or stat == -1:
            book_id = categories.book.id
            BookInfo.objects.filter(id=book_id).update(position=Location.objects.get(id=32))
        return redirect('/books-info/')

Для обновления позиции я использовал Location.objects.get (id = 32) (id = 32 соответствует позиции (0,0,0)). Есть ли другое решение или лучший способ без перезаписи UpdateView для автоматического изменения позиции?

Я пытался использовать такой код:

# Not work
BookInfo.objects.filter(id=book_id).update(position__room=0,position__bookcase=0,position__shelf=0)

# Not work
BookInfo.objects.select_related().filter(id=book_id).update(position__room=0,position__bookcase=0,position__shelf=0)

# Not work
test = BookInfo.objects.get(id=book_id)
test.position__room=0
test.position__bookcase=0
test.position__shelf=0
test.save(update_fields=['position__room','position__bookcase','position__shelf'])

Спасибо за совет и помощь

...