Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - AdminUser

Страницы: 1 2 3 [4] 5
46
Обнаружил, что ошибка здесь:

    def render(self, name, value, attrs=None):
        print '========================'
        context = self.get_context(name, value, attrs)
        template = loader.get_template(self.template_name).render(context)
        return mark_safe(template)


Был не объявлен loader. Закомментировал весь блок. Теперь другая ошибка:

Цитата:
Invalid block tag on line 1: 'value'. Did you forget to register or load this tag?
1   <div style='color:brown'id="mywidget-{{ widget.name }}">{% value %}</div>

47
Всем привет!

Написал кастомный виджет:

class EmptyWidget(Widget):
    template_name = 'widgets/empty.html'

    def get_context(self, name, value, attrs=None):
        return {'widget': {
            'name': name,
            'value': value,
        }}

    def render(self, name, value, attrs=None):
        print '========================'
        context = self.get_context(name, value, attrs)
        template = loader.get_template(self.template_name).render(context)
        return mark_safe(template)

Но когда назначаю его в форме через

        widgets = {
            'TargetProfile': EmptyWidget()
        }


то ничего не происходит: TargetProfile отображается как обычный SlugField. Если назначаю так:

TargetProfile = forms.SlugField(label='Автор', initial='',widget = EmptyWidget)     
то получаю ошибку
Цитата:
global name 'loader' is not defined


Полный код:

from main.widgets import EmptyWidget

class RatingForm(forms.ModelForm):

    TargetProfile = forms.SlugField(label='Автор', initial='',widget = EmptyWidget)                     

    class Meta(object):

        model = Raiting
        fields =  ('Value', 'Target')                                    
            'Value': 'Оценка',
            'Target': 'К записи',
        }
        help_texts = {
            'Value': ('Изменить значение'),
        }
        widgets = {
            'TargetProfile': EmptyWidget()
        }

    def __init__(self, *args, **kwargs):

        if kwargs.__contains__(u'instance'):                                             #скорее всего для python3 другое...
            if kwargs[u'instance']:
                kwargs.update(initial={
                    # 'field': 'value'
                    'TargetProfile': kwargs[u'instance'].Target.From                     # переопределит get_fields в TabularInline
                })

            print kwargs[u'instance']

        super(RatingForm, self).__init__(*args, **kwargs)

        self.submit = u'Оценить'
        self.css_class = ''

Полный код ошибки:

Цитата:
Request Method:   GET
Request URL:   http://127.0.0.1:8000/raiting/
Django Version:   1.11.17
Exception Type:   NameError
Exception Value:   
global name 'loader' is not defined

Error during template rendering


Что это за ошибка?

48
Как вы можете быть уверены, что она инициализируется инстансом модели?

49
Точно, а как мне тогда передать в ModelAdmin собственный Field?

50
А как выглядит сам ViewImageField?

class ViewImageField(BoundField):

    def __init__(self, form, field, name, textvalue = 'textvalue', css_cls = 'upload_image'):
        if textvalue == 'textvalue': textvalue = 'Define ' + textvalue + ' in ' + self.__class__.__name__
        self.text = textvalue
        self.css_class = 'class=' + css_cls

        super(ViewImageField, self).__init__(form, field, name)

    def label_tag(self, contents=None, attrs=None, label_suffix=None):

51
Кастомизирую админку и переопределяю formfield_overrides :

class NewAdmin(admin.ModelAdmin):

    fields = (
        ('City','Age'),
        'Sex',
        'Image'
    )

    formfield_overrides = {
        models.ImageField : {'widget' : ViewImageField}
    }

Как только переопределил formfield_overrides , сразу получаю ошибку:

Цитата:
TypeError at /admin/main/profile/1/change/
__init__() takes at least 4 arguments (1 given)
Request Method:   GET
Request URL:   http://127.0.0.1:8000/admin/main/profile/1/change/
Django Version:   1.11.17
Exception Type:   TypeError
Exception Value:   
__init__() takes at least 4 arguments (1 given)
Exception Location:   D:\django\hello\lib\site-packages\django\forms\fields.py in __init__, line 96
Python Executable:   D:\django\hello\Scripts\python.exe

Что за дела?

52
А можно ли как-то эту возможность прикрутить? Я, например, хочу, переопределить поле класса в наследнике на свойство класса


53
Прям такого понятия нет, но похожую роль выполняет метод __new__ метакласса для вашего класса:

class MyMetaclass(type):

    def __new__(metacls, class_name, class_parents, class_attr):
        //ваш код тут
        return type(class_name, class_parents, class_attr)
       
class MyClass(metaclass = MyMetaclass):
    pass

Он выполняется при инициализации класса, а не объекта - так же, как и статический конструктор

54
Есть ли в питоне статические свойства?

55
Ошибка возникла при использовании кастомного __metaclass__ в модели:

Цитата:
metaclass conflict: the metaclass of a derived class must be a subclass of metaclasses of all its basics

Что такое?

56
Python / Re: Чем отличается __init__ от __new__?
« : Февраля 24, 2019, 03:17:43 pm »
Метод __new__ вызывается до __init__, принимает в качестве параметра класс и  должно вернуть экземпляр класса. Классическое использование:

class C(object):

    def __init__(self):
        print type(self)

    def __new__(cls, *args, **kwargs):
        obj = super(C, cls).__new__(cls)
        print "sdfsfs"
        return obj


57
Django / Re: Зачем нужен list_display в ModelAdmin
« : Февраля 16, 2019, 11:39:55 am »
Можешь попробовать, как тут, у меня работает:

list_display = ('first_name', 'last_name')
Можно указывать свои собственные кастомные поля, тоже работает:

list_display = ('first_name', 'last_name', 'City')
Вот еще ссылочки по теме: тыц,

58
Django / Re: Зачем нужен list_display в ModelAdmin
« : Февраля 16, 2019, 11:28:43 am »
Насколько я понимаю, list_display используется не для DetailView, а для ListView моделей

59
Python / Re: Чем отличается isdigit и isdecimal?
« : Февраля 16, 2019, 10:14:16 am »
isdigit() - для строк в кодировке ascii.
isdecimal() - для строк в кодировке unicode.

Т.к. в питоне, начиная с 3-ей версии, строки по умолчанию хранятся в юникоде, то isdecimal будет работать правильней, ибо он будет охватывать весь спектр кодов юникода, а isdigit - гарантированно только в диапазоне 0-127

Во втором питоне для типа str предпочтительней isdigit

60
Ок, спасибо

А как быть насчет

This password is too short. It must contain at least 8 characters.
This password is entirely numeric.

Страницы: 1 2 3 [4] 5