Пожалуйста исправьте ошибку ниже

Здравствуйте столкнулся с проблемой в django с правами пользователя.

Для юзера с группой в которую не входит возможность редактировать модели указные в inlines. При сохранении от лица юзера, выбивается ошибка «Пожалуйста, исправьте ошибки ниже.» Но при этом ни какое из полей не подсвечивается.

введите сюда описание изображения

Хитрым трюком при изменении прав и сохранив модель без прегезагрузки страницы мне удалось увидеть эти ошибки. Как тогда понимать что эти поля пустые, если на первом скриншоте видно что поля не пустые?

введите сюда описание изображения

И соответственно перезагрузив страницу с all правами, все поля заполненные, и модель сохраняется без проблем. Но мне надо огранчить возможность удалять и изменять inlines модели для пользователя.

введите сюда описание изображения
Помогите пожалуйста, вылечить данный баг!(

Если нужны будут дополнительные сведения пишите предоставлю, но ни каких проблем в коде я не встречаю.

UPDATE

models.py

# Product stock

class Stock(models.Model):
    invoice = models.CharField(max_length=255, default="", verbose_name="№ Наклданой")
    date_create = models.DateTimeField(auto_now_add=True, verbose_name="Дата поступления")

class Meta:
    verbose_name = 'Поступление'
    verbose_name_plural = 'Поступления'
    ordering = ["-pk"]

def __str__(self):
    return self.invoice



class StockProduct(models.Model):
    Stock = models.ForeignKey(Stock, on_delete=models.CASCADE, verbose_name="Накладная", null=True)
    product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name="Модель")
    value = models.IntegerField(verbose_name="Количество товара", default=0)

class Meta:
    verbose_name = 'Дверь'
    verbose_name_plural = 'Двери'

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

def save(self, *args, **kwargs):
    model = Product.objects.filter(pk=self.product.pk).first()
    model.value = model.value + self.value
    model.save()
    super(StockProduct, self).save(*args, **kwargs)


class StockMDF(models.Model):
     Stock = models.ForeignKey(Stock, on_delete=models.CASCADE, verbose_name="Накладная", null=True)
     mdf = models.ForeignKey(MDF, on_delete=models.CASCADE, verbose_name="МДФ панель")
     value = models.IntegerField(verbose_name="Количество товара", default=0)

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

class Meta:
    verbose_name = 'МДФ панель'
    verbose_name_plural = 'МДФ панели'

def save(self, *args, **kwargs):
    model = MDF.objects.filter(pk=self.mdf.pk).first()
    model.value = model.value + self.value
    model.save()
    super(StockMDF, self).save(*args, **kwargs)


 class StockLockCylinder(models.Model):
    Stock = models.ForeignKey(Stock, on_delete=models.CASCADE, verbose_name="Накладная", null=True)
    lockcylinder = models.ForeignKey(LockCylinder, on_delete=models.CASCADE, verbose_name="Цилиндр замка")
    value = models.IntegerField(verbose_name="Количество товара", default=0)

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

class Meta:
    verbose_name = 'цилиндр замка'
    verbose_name_plural = 'цилиндры замков'

def save(self, *args, **kwargs):
    model = LockCylinder.objects.filter(pk=self.lockcylinder.pk).first()
    model.value = model.value + self.value
    model.save()
    super(StockLockCylinder, self).save(*args, **kwargs)

admin.py

from django.contrib import admin
from .models import *


class HideAdmin(admin.ModelAdmin):
    get_model_perms = lambda self, req: {}


class StockProductAdmin(admin.StackedInline):
    model = StockProduct
    extra = 1


class StockMDFAdmin(admin.StackedInline):
    model = StockMDF
    extra = 1


class StockLockCylinderAdmin(admin.StackedInline):
    model = StockLockCylinder
    extra = 1


class StockAdmin(admin.ModelAdmin):
    readonly_fields = ['date_create']
    inlines = (StockProductAdmin, StockMDFAdmin, StockLockCylinderAdmin)


# Register your models here.
admin.site.register(Maker, admin.ModelAdmin)
admin.site.register(SizeDoor, admin.ModelAdmin)
admin.site.register(LockCylinder, admin.ModelAdmin)
admin.site.register(MDF, admin.ModelAdmin)
admin.site.register(Product, admin.ModelAdmin)
admin.site.register(Stock, StockAdmin)

UDPATE 20.12.18

Данная проблема возникает с любой моделью, которая, указана как StackedInline также такая проблема возникает у моделей StackedInline с полем read only.

Version Info:
Django — 2.1.3

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

Теперь, когда я пытаюсь создать нового пользователя с панели администратора, я получаю это сообщение об ошибке Изображение 75797

поэтому не очень полезно. Также у меня такая же проблема, если я использую форму «изменить» или «создать» форму.

Однако, если я попытаюсь создать нового пользователя через оболочку, например

MyUser.objects.create_user(email="[email protected]", password=None)

оно работает.


Исправление проблем

Вот модель пользовательского пользователя:

class MyUser(AbstractBaseUser):
    """
    A base user on the platform. Users are uniquely identified by
    email addresses.
    """
    email = models.EmailField(
        verbose_name = "Email address",
        max_length   = 100,
        unique       = True
    )
    is_active  = models.BooleanField(default=True, blank=True)
    is_admin   = models.BooleanField(default=False, blank=True)

    @property
    def is_staff(self):
        return self.is_admin

    objects = MyUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ()

    def get_full_name(self):
        return self.email

    def get_short_name(self):
        return self.email

    def __unicode__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        '''Does the user have a specific permission?'''
        return True

    def has_module_perms(self, app_label):
        '''Does the user have permissions to view the app 'app_label'?'''
        return True
  • Одно из объяснений заключается в том, что оно имеет какое-то отношение к полю MyUser, у которого есть blank=False но которое не отображается моим ModelForm. Я дважды проверил, и все в порядке.

  • Еще одно объяснение заключается в том, что проверка формы создания администратора каким-то образом унаследовала от модели User django.contrib.auth по django.contrib.auth и она пытается найти поле User, которого нет в MyUser. Как я могу это проверить?

  • Есть идеи?

Уведомления

  • Начало
  • » Django
  • » «Пожалуйста, исправьте ошибки ниже. » в админке — как лечить

#1 Июль 23, 2010 18:40:24

«Пожалуйста, исправьте ошибки ниже. » в админке — как лечить

Вылезла такая ошибка, не знаю что делать
При попытке редактировании некоторой модели постоянно не проходит валидацию формы, причем в каком поле ошибка не пишет
вот модель:

class Machine(models.Model):
serial = models.CharField(max_length=30, blank=True, null=True)
client = models.ForeignKey(Client, related_name="machines")
# customer = models.ForeignKey(Client, blank=True, null=True, related_name="machines_customer")
alias = models.CharField(max_length=30, blank=True)
machinemark = models.ForeignKey(MachineMark)
month = models.IntegerField()
motohours = models.IntegerField()

пробовал и с закомментированной строчкой, и без — одно и тоже
с остальными моделями в проекте все нормально

Офлайн

  • Пожаловаться

#2 Июль 23, 2010 18:45:16

«Пожалуйста, исправьте ошибки ниже. » в админке — как лечить

ах да, деталь в картину: пробовал точно те же данные ввести в inlineadmin для этой модели — все сохранилось! не вылезла ошибка валидации формы.
Как отладить?

Офлайн

  • Пожаловаться

#3 Июль 23, 2010 18:45:59

«Пожалуйста, исправьте ошибки ниже. » в админке — как лечить

скорее всего есть некоторое обязательно поле (например у тебя это может быть client, или machinemark, или month, или motohours) и ты не прописал его в классе в admin.py. Так что admin.py в студию.

Офлайн

  • Пожаловаться

#4 Июль 23, 2010 18:47:01

«Пожалуйста, исправьте ошибки ниже. » в админке — как лечить

inlineadmin — это совсем другая модель, которая видимо нормально описана в admin.py.

Офлайн

  • Пожаловаться

#5 Июль 23, 2010 18:50:16

«Пожалуйста, исправьте ошибки ниже. » в админке — как лечить

локализировал проблему:

class MachineAdmin(admin.ModelAdmin):
inlines = [#ReportInline,
# FixInline,
# MaintenanceInline,
# CheckupInline,
# UploadInline,
]

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

Офлайн

  • Пожаловаться

#6 Июль 23, 2010 18:56:08

«Пожалуйста, исправьте ошибки ниже. » в админке — как лечить

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

@register.filter(name='rstrip_inline_formset')
def rstrip_inline_formset(value, args):

count = 0
for form in value:
count += 1

i = 0
result = []
for form in value:
i += 1
if i>count-args:
break
result.append(form)

return result

Офлайн

  • Пожаловаться

#7 Июль 23, 2010 18:58:17

«Пожалуйста, исправьте ошибки ниже. » в админке — как лечить

vaxXxa
скорее всего есть некоторое обязательно поле (например у тебя это может быть client, или machinemark, или month, или motohours) и ты не прописал его в классе в admin.py. Так что admin.py в студию.

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

Офлайн

  • Пожаловаться

#8 Июль 23, 2010 23:06:21

«Пожалуйста, исправьте ошибки ниже. » в админке — как лечить

ну, в инлайновых классах есть атрибут extra. Он отвечает за количество инлайновых полей.

Офлайн

  • Пожаловаться

#9 Июль 24, 2010 23:21:24

«Пожалуйста, исправьте ошибки ниже. » в админке — как лечить

vaxXxa
ну, в инлайновых классах есть атрибут extra. Он отвечает за количество инлайновых полей.

спасибо, то, что нужно!

Офлайн

  • Пожаловаться

  • Начало
  • » Django
  • » «Пожалуйста, исправьте ошибки ниже. » в админке — как лечить

Problem

I had a similar problem.
But that’s pretty easy to solve.


How to solve it step by step?

First of all we need to talk about overriding, as you said before.
Django by default uses username field in models. And you need to change it like this in your models.py:

USERNAME_FIELD = 'email'

If you still really want to override a lot of code, next: create managers. Something about this: django managers
In your custom manages class you need to override user creation (create_user method) and create_superuser method With this samples:

def create_user(self, email, password, **extra_fields):
    """
    Create and save a User with the given email and password.
    """
    log.debug(f'Creating user: {email}')
    if not email:
        raise ValueError(_('The email must be set'))
    email = self.normalize_email(email)
    user = self.model(email=email, **extra_fields)
    user.set_password(password)
    user.save()
    log.info('Created user %s', repr(user))

Only after all this steps you can take care about overriding existing forms.
Django doc about this: https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#custom-users-admin-full-example
implementation:

class CustomUserCreationForm(UserCreationForm):

    class Meta(UserCreationForm):
        model = CustomUser
        fields = ('email', )


class CustomUserChangeForm(UserChangeForm):

    class Meta:
        model = CustomUser
        fields = ('email', )

This forms are used for user Creation in your admin and User changing.
And only now you can add code in your admin.py and change your UserAdmin like that:

@admin.register(CustomUser)
class CustomUserAdmin(UserAdmin):
    add_form = CustomUserCreationForm
    form = CustomUserChangeForm
    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        ('Personal info', {'fields': ('first_name', 'last_name',)}),
        ('Permissions', {
            'fields': ('is_admin',),
        }),
        ('Important dates', {'fields': ('last_login',)}),
    )
    # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
    # overrides get_fieldsets to use this attribute when creating a user.
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'password1', 'password2', 'is_admin', 'is_root', )}
         ),
    )
    list_display = ('email', 'first_name', 'last_name', 'is_admin', 'created_at', 'updated_at',)
    list_filter = ('is_admin',)
    search_fields = ('email', 'first_name', 'last_name',)
    ordering = ('email',)
    filter_horizontal = ()

Be sure to add add_fieldsets and to override ordering by email.
In add_fieldsets you need to 2 type of passwords. If there be only 1 — error occures. From your screen by the way.


I hope this helps everyone who ever encounters this problem.

Проблема только на хостинге, у меня всё норм. Аккаунт админа без проблем авторизуется как auth_user (наравне с простыми смертными пользователями). Админка говорит «Пожалуйста, исправьте ошибки ниже.»

urls.py:

url(r'^admin/', include(admin.site.urls)),
                       url(r'^grappelli/', include('grappelli.urls')),
                       url(r'^accounts/login/', 'django.contrib.auth.views.login', {'template_name': 'login.html'},),
                       url(r'^accounts/logout/', 'django.contrib.auth.views.logout_then_login'),
                       url(r'^', include('django.contrib.flatpages.urls')),

До этого убрал из MIDDLEWARE_CLASSES

'django.contrib.auth.middleware.SessionAuthenticationMiddleware',

UPD:
Теперь можно залогиниться, отключив grappelli благодаря строчке admin.autodiscover() в urls.py. Grappelli по-прежнему просит исправить ошибки, которых нет.

Понравилась статья? Поделить с друзьями:
  • Пмм сименс ошибка е14
  • Подключите интернет кабель к этому компьютеру ошибка
  • Пмм сименс ошибка е09
  • Погрузчик вилочный митсубиси ошибки
  • Пмм сименс ошибка е07