I have made custom BaseUserManager to create user but I am getting error of «please correct the errors below» when I add user from django admin panel and I can’t find what’s going wrong.
Models.py:
class UserManager(BaseUserManager):
def create_user(self,email,password):
user = self.model(email=email)
user.set_password(password)
def create_superuser(self,email,password):
user = self.model(email=email)
user.set_password(password)
user.is_admin = True
user.is_superuser = True
user.is_staff=True
user.save(using=self._db)
class User(AbstractBaseUser,PermissionsMixin):
COMPANY='CO'
EMPLOYEE='EM'
STATUS_CHOICES=(
(COMPANY,'Company'),
(EMPLOYEE,'Employee'),
)
Status=models.CharField(max_length=2,
choices=STATUS_CHOICES,
default=EMPLOYEE)
user_image = models.CharField(max_length=100)
is_admin=models.BooleanField()
email=models.EmailField(unique=True)
is_staff=models.BooleanField(default=False)
object = UserManager()
USERNAME_FIELD='email'
REQUIRED_FIELDS = []
objects=models.Manager()
def get_short_name(self):
return self.email
Admin.py files:
class UserAdmin(UserAdmin):
list_display = ('email', 'is_admin')
list_filter = ('is_admin',)
fieldsets = (
(None, {'fields': ('email', 'password','Status','user_image','last_login')}),
('Permissions', {'fields': ('is_admin','is_staff','is_superuser','user_permissions','groups')}),
)
add_fieldsets= (
(None, {'fields': ('email', 'password','Status','user_image','last_login')}),
('Permissions', {'fields': ('is_admin','is_staff','is_superuser','user_permissions','groups')}),
)
search_fields = ('password',)
ordering = ('password',)
filter_horizontal = ()
admin.site.register(User,UserAdmin)
admin.site.register(Company)
admin.site.register(Employee)
admin.site.register(Job)
admin.site.register(AppliedJobs)
Can someone suggest what I am doing wrong? I always get the error when I add user from admin panel.I can’t figure out as I am working first time on baseusermanager.
Здравствуйте столкнулся с проблемой в 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
- » «Пожалуйста, исправьте ошибки ниже. » в админке — как лечить
#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 += 1i = 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
- » «Пожалуйста, исправьте ошибки ниже. » в админке — как лечить
Модели создаются из следующей базы данных mysql с «python manage.py inspectdb —database = mydatabasename»:
CREATE TABLE `authors` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) DEFAULT NULL, `birthday` date DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; CREATE TABLE `books` ( `id` int(11) NOT NULL AUTO_INCREMENT, `titel` varchar(45) DEFAULT NULL, `year` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; CREATE TABLE `authors_books` ( `author_id` int(11) NOT NULL, `book_id` int(11) NOT NULL, KEY `fk_authors_books
class Authors(models.Model): name = models.CharField(max_length=45, blank=True, null=True) birthday = models.DateField(blank=True, null=True) class Meta: managed = True db_table = 'authors' verbose_name_plural = 'Authors' def __unicode__(self): return self.name class AuthorsBooks(models.Model): author_id = models.OneToOneField('Authors', models.DO_NOTHING, db_column='author_id', primary_key=True) book_id = models.OneToOneField('Books', models.DO_NOTHING, db_column='book_id', primary_key=True) class Meta: managed = True db_table = 'authors_books' unique_together = (('author_id', 'book_id'),) verbose_name_plural = 'Author Books' class Awards(models.Model): author = models.OneToOneField('Authors', models.DO_NOTHING, db_column='author', primary_key=True) award_name = models.CharField(max_length=45) year = models.IntegerField(blank=True, null=True) class Meta: managed = True db_table = 'awards' unique_together = (('author', 'award_name'),) verbose_name_plural = 'Awards' class Books(models.Model): titel = models.CharField(max_length=45, blank=True, null=True) year = models.IntegerField(blank=True, null=True) class Meta: managed = True db_table = 'books' verbose_name_plural = 'Books' def __unicode__(self): return '{} - {}'.format(self.titel, self.year)
idx` (`book_id`),
KEY `fk_authors_books_1` (`author_id`),
CONSTRAINT `fk_authors_books_1` FOREIGN KEY (`author_id`) REFERENCES `authors` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_authors_books_2` FOREIGN KEY (`book_id`) REFERENCES `books` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `awards` (
`author` int(11) NOT NULL,
`award_name` varchar(45) NOT NULL,
`year` int(11) DEFAULT NULL,
PRIMARY KEY (`author`,`award_name`),
CONSTRAINT `fk_awards_1` FOREIGN KEY (`author`) REFERENCES `authors` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Модели выглядят так:
class Authors(models.Model): name = models.CharField(max_length=45, blank=True, null=True) birthday = models.DateField(blank=True, null=True) class Meta: managed = True db_table = 'authors' verbose_name_plural = 'Authors' def __unicode__(self): return self.name class AuthorsBooks(models.Model): author_id = models.OneToOneField('Authors', models.DO_NOTHING, db_column='author_id', primary_key=True) book_id = models.OneToOneField('Books', models.DO_NOTHING, db_column='book_id', primary_key=True) class Meta: managed = True db_table = 'authors_books' unique_together = (('author_id', 'book_id'),) verbose_name_plural = 'Author Books' class Awards(models.Model): author = models.OneToOneField('Authors', models.DO_NOTHING, db_column='author', primary_key=True) award_name = models.CharField(max_length=45) year = models.IntegerField(blank=True, null=True) class Meta: managed = True db_table = 'awards' unique_together = (('author', 'award_name'),) verbose_name_plural = 'Awards' class Books(models.Model): titel = models.CharField(max_length=45, blank=True, null=True) year = models.IntegerField(blank=True, null=True) class Meta: managed = True db_table = 'books' verbose_name_plural = 'Books' def __unicode__(self): return '{} - {}'.format(self.titel, self.year)
В классе AuthorsBooks я изменил два внешних ключа на OneToOneFields.
Мой admin.py выглядит так:
from django.contrib import admin from myapp.models import Authors ... class AwardsInline(admin.TabularInline): model = Awards class AuthorsBooksInline(admin.TabularInline): model = AuthorsBooks class AuthorsAdmin(admin.ModelAdmin): list_display = ("name", "birthday" ) inlines = (AwardsInline, AuthorsBooksInline) class BooksAdmin(admin.ModelAdmin): list_display = ("id", "titel", "year" ) admin.site.register(Authors, AuthorsAdmin) admin.site.register(Books, BooksAdmin)
Когда я пытаюсь изменить автора на странице администратора django, я получаю следующие ошибки:
Вопрос:
Я работаю над приложением Django, и я выполнил именно эти инструкции для создания пользовательского пользователя.
Теперь, когда я пытаюсь создать нового пользователя с панели администратора, я получаю это сообщение об ошибке
поэтому не очень полезно. Также у меня такая же проблема, если я использую форму “изменить” или “создать” форму.
Однако, если я попытаюсь создать нового пользователя через оболочку, например
MyUser.objects.create_user(email="test@gmail.com", 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
. Как я могу это проверить? -
Есть идеи?
Лучший ответ:
Хорошо, ребята, спасибо за ваши ответы, но моя проблема действительно возникла из моего переопределения UserAdmin
.
Более конкретно, UserAdmin
использует add_form
и form
для ссылки на формы создания и изменения соответственно. Как я назвал мои переменные creation_form
и change_form
, он не отменяет django.contrib.auth.models.User
формы и почему некоторые поля не проверять, потому что мой ModelForm
не показывал эти User
поля.
Теперь я переименовал creation_form
в add_form
и change_form
, чтобы form
внутри моего пользовательского UserAdmin
, и он работает как шарм 🙂
Ответ №1
У меня была аналогичная проблема. Но это не было в форме администратора, это было в списке admin. Я использовал поля list_editable. Когда я буду сохранять изменения, я получаю сообщение “Пожалуйста, исправьте ошибку ниже”, ничего не подсвечивая.
Моя ошибка состояла в том, что я включил первое поле в list_display как list_editable. Чтобы исправить это, я добавляю ‘id’ в начало полей list_display.
Ответ №2
Я думаю, что это может помочь, потому что пароль CharField
в AbstractBaseUser
имеет blank
свойство по умолчанию для False
:
class MyUser(AbstractBaseUser):
def __init__(self, *args, **kwargs):
super(MyUser, self).__init__(*args, **kwargs)
passwd = [field for field in self._meta.fields if field.attname is 'password']
if passwd:
passwd[0].blank = True