Игнорировать значение POST из встроенного администратора - PullRequest
0 голосов
/ 04 марта 2020

in django У меня есть inlineadmin с некоторыми флажками, я хочу, чтобы при сохранении некоторых условий один из них игнорировался при сохранении.

Я попытался изменить request.POST ['mykey'] или form.data ['mykey'] в save_model () основного класса с request.POST._mutable = True, но django сохранит все в любом случае, и для form.data он говорит, что он неизменен. Я знаю, что могу установить значение для obj.mykey, но как сохранить другие и игнорировать один?

Большое спасибо всем.

ОБНОВЛЕНИЕ

Я строю несколько строк кодов, чтобы объяснить лучше:

models.py

from django.db import models

class Author(models.Model):
   name = models.CharField(max_length=100)

class Book(models.Model):
   author = models.ForeignKey(Author, on_delete=models.CASCADE)
   title = models.CharField(max_length=100)

admin.py:

from django.contrib import admin
from testB.models import Book, Author

class BookInLine(admin.TabularInline):
    model = Book
    fields = ['author', 'title']


class AuthorAdmin(admin.ModelAdmin):
    inlines = [BookInLine]

    def save_model(self, request, obj, form, change):
        if request.user.is_superuser:
            #do not save first title and do not change existing value

            # does not work
            # request.POST._mutable = True
            # request.POST['id_book_set-0-id']=''

            # does not owrk: querydict immutable
            # form.data['id_book_set-0-id']=''

            pass
        super().save_model(request, obj, form, change)


admin.site.register(Author, AuthorAdmin)

Использование has_change_permission не подходит, потому что пользователь должна иметь возможность изменять другие строки заголовка, это проверка бэкенда.

1 Ответ

0 голосов
/ 05 марта 2020

Решено! Используйте save_formset () вместо save_model ():

class AuthorAdmin(admin.ModelAdmin):
    inlines = [BookInLine]

    def save_formset(self, request, form, formset, change):
            instances = formset.save(commit=False)
            for obj in formset.deleted_objects:
                obj.delete()
            for instance in instances:
                if request.user.is_superuser and instance.title != 'my title':
                    instance.save()
            formset.save_m2m()


admin.site.register(Author, AuthorAdmin)
...