Настраиваемая форма модели в табличной строке администратора дает ошибку целостности - PullRequest
1 голос
/ 21 января 2020

Я создал специальную форму модели, чтобы можно было изменить текст заголовка:

forms.py

class AddRoomAddRoomExtrasForm(ModelForm):
    roomextrafields = forms.ModelChoiceField(queryset=RoomExtra.objects.all(), label=_('Room Extras'))

    class Meta:
        model = RoomExtra
        fields = ('roomextrafields', )

admin.py

class RoomExtraInLine(admin.TabularInline):
    model = Room.roomextra.through
    extra = 1
    verbose_name = _('extra')
    verbose_name_plural = _('extras')
    form = AddRoomAddRoomExtrasForm

class RoomAdmin(admin.ModelAdmin):
    model = Room
    inlines = [RoomExtraInLine, ]
    exclude = ['roomextra', ]

модели .py

class Room(models.Model):
    roomextra = models.ManyToManyField(
        to='hotel.RoomExtra',
        related_name='room_extras',
    )

но я получаю ошибку:

IntegrityError at /admin/hotel/room/add/
NOT NULL constraint failed: hotel_room_roomextra.roomextra_id

TRACEBACK

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/admin/hotel/room/add/

Django Version: 2.2.9
Python Version: 3.8.0
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'whitenoise.runserver_nostatic',
 'django.contrib.staticfiles',
 'users',
 'hotel',
 'reservation',
 'django.contrib.sites',
 'allauth',
 'allauth.account',
 'allauth.socialaccount']
Installed Middleware:
('whitenoise.middleware.WhiteNoiseMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'whitenoise.middleware.WhiteNoiseMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')



Traceback:

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/db/backends/utils.py" in _execute
  84.                 return self.cursor.execute(sql, params)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py" in execute
  383.         return Database.Cursor.execute(self, query, params)

The above exception (NOT NULL constraint failed: hotel_room_roomextra.roomextra_id) was the direct cause of the following exception:

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/core/handlers/base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/core/handlers/base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/contrib/admin/options.py" in wrapper
  606.                 return self.admin_site.admin_view(view)(*args, **kwargs)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/utils/decorators.py" in _wrapped_view
  142.                     response = view_func(request, *args, **kwargs)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
  44.         response = view_func(request, *args, **kwargs)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/contrib/admin/sites.py" in inner
  223.             return view(request, *args, **kwargs)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/contrib/admin/options.py" in add_view
  1645.         return self.changeform_view(request, None, form_url, extra_context)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/utils/decorators.py" in _wrapper
  45.         return bound_method(*args, **kwargs)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/utils/decorators.py" in _wrapped_view
  142.                     response = view_func(request, *args, **kwargs)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/contrib/admin/options.py" in changeform_view
  1529.             return self._changeform_view(request, object_id, form_url, extra_context)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/contrib/admin/options.py" in _changeform_view
  1573.                 self.save_related(request, form, formsets, not add)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/contrib/admin/options.py" in save_related
  1116.             self.save_formset(request, form, formset, change=change)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/contrib/admin/options.py" in save_formset
  1104.         formset.save()

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/forms/models.py" in save
  669.         return self.save_existing_objects(commit) + self.save_new_objects(commit)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/forms/models.py" in save_new_objects
  807.             self.new_objects.append(self.save_new(form, commit=commit))

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/forms/models.py" in save_new
  947.         return super().save_new(form, commit=commit)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/forms/models.py" in save_new
  646.         return form.save(commit=commit)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/forms/models.py" in save
  458.             self.instance.save()

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/db/models/base.py" in save
  740.         self.save_base(using=using, force_insert=force_insert,

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/db/models/base.py" in save_base
  777.             updated = self._save_table(

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/db/models/base.py" in _save_table
  870.             result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/db/models/base.py" in _do_insert
  907.         return manager._insert([self], fields=fields, return_id=update_pk,

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/db/models/manager.py" in manager_method
  82.                 return getattr(self.get_queryset(), name)(*args, **kwargs)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/db/models/query.py" in _insert
  1186.         return query.get_compiler(using=using).execute_sql(return_id)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/db/models/sql/compiler.py" in execute_sql
  1368.                 cursor.execute(sql, params)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/db/backends/utils.py" in execute
  99.             return super().execute(sql, params)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/db/backends/utils.py" in execute
  67.         return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/db/backends/utils.py" in _execute_with_wrappers
  76.         return executor(sql, params, many, context)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/db/backends/utils.py" in _execute
  84.                 return self.cursor.execute(sql, params)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/db/utils.py" in __exit__
  89.                 raise dj_exc_value.with_traceback(traceback) from exc_value

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/db/backends/utils.py" in _execute
  84.                 return self.cursor.execute(sql, params)

File "/Users/leonhughes/Documents/virtualenvs/django/hlms/env/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py" in execute
  383.         return Database.Cursor.execute(self, query, params)

Exception Type: IntegrityError at /admin/hotel/room/add/
Exception Value: NOT NULL constraint failed: hotel_room_roomextra.roomextra_id

Однако, когда я использую стандартную форму, ie. закомментируйте:

form = AddRoomAddRoomExtrasForm

все сохраняется правильно и нет ошибки целостности. Что еще мне нужно добавить в пользовательскую форму, чтобы функциональность была ожидаемой?

Обновление

В предложении @Chris я изменил поле Meta поэтому класс формы становится:

class AddRoomAddRoomExtrasForm(forms.ModelForm):
    roomextrafields = forms.ModelChoiceField(queryset=RoomExtra.objects.all(), label=_('Room Extras'))

    class Meta:
        model = Room.roomextra.through
        fields = ('roomextrafields', )

, но появляется та же ошибка

1 Ответ

0 голосов
/ 21 января 2020

Поскольку все, что я хотел сделать, это изменить метку столбца в табличной строке, я смог изменить форму на:

class AddRoomAddRoomExtrasForm(forms.ModelForm):

class Meta:
    model = Room.roomextra.through
    fields = '__all__'
    labels = {
        'roomextra': _('Room Extra(s)'),
    }

Проблема была с настраиваемыми полями. При тестировании с настройкой ' all ' модель смогла сохранить

...