@pydjango

Страница 610 из 1273
Massimo
02.10.2017
06:54:28
Единственное что я вижу - так это обрезать им досутп к тем полям.

Andrey
02.10.2017
07:00:25
Делаем следующим образом. Создаем нужное количество разнообразных форм, унаследовавшись от базовой. В файле с вьюхами создаем словарь, где ключ - название группы, значение - форма. В самой вьхе пишем что-то типа form = forms_dict[request.user.group]

Готово, у Вас во вьюхе получена специальная форма для определенной группы пользователей

Вынесите все формы данного типа в отдельный файл, чтобы не запутаться.

Google
Andrey
02.10.2017
07:03:00
Ну да.

Artem
02.10.2017
07:04:09
всем добричка!

Dan
02.10.2017
07:04:26
псс, пацанчик ООП не хочешь ? первая доза бесплатно ;)

Andrey
02.10.2017
07:04:28
Просто это будет работать. И будет хорошо работать. И если групп пользователей не over 9999999, то и кода будет не много. Отдельный файлик, где легко, лаконично и просто можно менять поля каждой из групп

Dan
02.10.2017
07:05:32
нее пока на текущем варианте нормально

Massimo
02.10.2017
07:09:45
А чем способ init плох?

Dan
02.10.2017
07:11:34
вариант с формами более трушный, более гибкий при дальнейшем развитии

те смотри если разница в одном поле и одном условии то да вариант с init вполне подходит, я так думаю

но если полей больше и вариантов условий больше то стоит разелать на разные сущности

Google
Dan
02.10.2017
07:14:27
опять таки избавляет от необходимости передавать лишние данные в форму

Serj
02.10.2017
07:17:28
А подскажите по поводу комментарией, как правильно сделать? На сайте есть несколько моделей - статья, продукт и тд. К ним нужно прицепить комментарии. Разные таблицы типа комментарии для статьи, комментарии для продукта делать не хочу, хочу чтобы это было в одной таблице. В других фреймворках опять же это решается полиморфными связями. А как это решается в джанго? в прошлый раз мне посоветовали для другой задачи contentTypes - тут это тру решение, или есть лучше?

Serj
02.10.2017
07:19:12
если на сайте будет за десяток типов материалов, это же будет неудобно пользователю в кабинете показывать его комментарии

или не?

content_type да как вариант но я бы делал разные таблицы
я же правильно понимаю что content_type это аналог полиморфных связей в джанге?

Dan
02.10.2017
07:22:27
ну во первых количество строк при выборке сокращается во вторых если понадобится хранить что то кроме того что есть в остальных то это лишее поле во всех остальных да и просто не нравится мне это

для такого случая есть классное решение в sqlalchemy

но в джанго такого вроде нет

Massimo
02.10.2017
07:25:06
class BookSubmitForm(ModelForm): def __init__(self, *args, **kwargs): self.request = kwargs.pop("request") super(BookSubmitForm, self).__init__(*args, **kwargs) Как один из Вариантов, только проблематика заключается в том, зачем здеся super()

Serj
02.10.2017
07:25:13
или общая модель, пока не понадобится для какого-то типа уникальное поле?

Massimo
02.10.2017
07:29:17
а чем тебе super не нравится ?
Я так понимаю что super() занимается наследованием родительского класса, но он (def) уже жде в классе

Google
Massimo
02.10.2017
07:31:47
Зачем ему его вызывать вданной конструкции?

Andrey
02.10.2017
07:38:32
Зачем ему его вызывать вданной конструкции?
ЧТобы использовать метод init родителя. Если перейти в него, можно увидеть, что он имеет свою логику. Переопределив его, мы полностью стираем эту логику и заменяем нашей. Но, когда мы делаем подобным образом мы не заменяем, а дополняем метод родителя

Massimo
02.10.2017
07:39:01
super дополняет?

Andrey
02.10.2017
07:39:36
super дополняет?
Не совсем. Super() - обращение к родителю. Super().init() к методу init родителя

Alex
02.10.2017
07:39:57
У меня достаточно странный вопрос есть... Точнее, я не совсем понимаю как его правильно сформулировать. В общем я работаю с вебсокетами в джанге через channels (притом, что я не до конца понимаю механизм функционирования вебсокетов в channels, поэтому что-то тут я уже гарантированно сделал неправильно). Также у меня есть приложение, которое запущено в папке одного из приложений джанги (речь о телеграм-боте), но которое фактически работает отдельно от неё (поместил бота в ту же папку чтобы было проще общими моделями пользоваться). Так вот: грубо говоря нужно чтобы сообщения, приходящие боту, пересылались в джанговское приложение (то бишь на сайт). И вот как это сделать я не совсем понимаю. Будет здорово, если подскажете.

Andrey
02.10.2017
07:40:02
и получается, у нас self.init + super().init

как-то так.

да я за вариант где для каждой типа материала отдельная таблица коментариев
А почему не создать отдельные сущности для комментариев и связать их с материалами?

А, ну, тоже самое Вы и говорите, ага

Тогда плюсую. Вытащить комментарии отдельно - лучшее, что можно придумать, на мой взгляд

Потом уже усложнять структуру, по мере надобности. Вводить ответы и т.п.

Massimo
02.10.2017
07:49:53
https://dpaste.de/yizR Вот так пытаюсь передать через инит форму, почему то не делает ее рид онли, даже если захожу под группой group. выдает File "C:\Users\sysoev.m\majorpack\personnel\forms.py", line 211, in __init__ self.request = kwargs.pop("request") KeyError: 'request'

Точнее он это выдает когда я делаю submit

Andrey
02.10.2017
07:52:50
Ну, он, дословно, говорит, что не в кваргах request-а

Massimo
02.10.2017
07:53:03
Что странно ведь шаблон по гет запросу

Грузится

Andrey
02.10.2017
07:53:24
Проверяйте содержимое кваргов.

Massimo
02.10.2017
07:56:37
Проверяйте содержимое кваргов.
Он ргается на инстанс теперь

Andrey
02.10.2017
07:57:21
я плохо в ясновидение. На какой инстанс? Где? Код, ошибку.

Google
Andrey
02.10.2017
08:09:25
Ну и где инстанс?

Где ошибка?

В чем ошибка? Ругается на инстанс

инстанс чего, кого, где

И, я может и ошибаюсь, но self.arrival, наверное, так надо.

Да и всё-таки надо super().init() делать, иначе остальные поля у вас не проинициализируются. Да и форма не проинициализируется

Massimo
02.10.2017
08:12:49
инстанс чего, кого, где
Инстанс 15 строка

Andrey
02.10.2017
08:13:15
Инстанс 15 строка
Окей, теперь вижу.

Но ошибку лучше всё равно присылать

Massimo
02.10.2017
08:13:32
Он почему то init инициализирует только при Post

File "C:\Users\sysoev.m\majorpack\personnel\forms.py", line 211, in __init__ self.request = kwargs.pop("request") KeyError: 'request'

Andrey
02.10.2017
08:13:39
Ага, увидел супер

Вам пишут, KEY_ERROR - нет такого ключа в кваргах

Massimo
02.10.2017
08:14:40
Andrey
02.10.2017
08:15:24
а) запустите дебаг и посмотрите, что у вас в кваргах. б) напишите print(kwargs) и посмотрите, что у Вас в кваргах

Если Вам пишут KeyError, это не издевка компилятора - это отсутствие ключа.

Massimo
02.10.2017
08:16:17
>б) напишите print(kwargs) и посмотрите, что у Вас в кваргах >Он ргается на инстанс теперь

Google
Andrey
02.10.2017
08:16:46
Ошибку, пожалуйста

не просто "Ругается"

а прям вот, что пишет

Massimo
02.10.2017
08:18:04
а прям вот, что пишет
File "C:\Users\sysoev.m\majorpack\personnel\forms.py", line 211, in __init__ print(**kwargs) TypeError: 'instance' is an invalid keyword argument for this function

Andrey
02.10.2017
08:18:12
Вопросы?

Massimo
02.10.2017
08:18:33
Почему инвалид?

Andrey
02.10.2017
08:18:46
Потому что его там нет.

Massimo
02.10.2017
08:19:24
form = PrimaryForm(instance=Plan.objects.get(pk=pk), request=request) return render(request, self.template_name, {'form': form, 'pk': pk, 'somequery': somequery}) Тоесть тут он ничего в кварги не отправляет?

Andrey
02.10.2017
08:21:00
Ой, туплю я

и вы)

он думает, что instance - параметр функции.

Когда мы ставим ** мы передаем словарь как аргумент-значение, на не просто словарь.

Поправьте, если не так.

Massimo
02.10.2017
08:22:15
{'instance': <Plan: Точка 1 Точка 2>, 'request': <WSGIRequest: GET '/personnel/primary/28'>}

Он передает не то, надо навреное requset.user

Andrey
02.10.2017
08:26:11
Скиньте, пожалуйста, Middleware из Settings.py, прям с названием списка

Massimo
02.10.2017
08:27:53
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', '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', ]

Andrey
02.10.2017
08:31:33
попробуйте поменять порядок, поставив AuthenticationMiddleware перед Session. Если верить гугулу, это исправит ошибку с получением user-a. А может и не исправит, глянем. Также, надо понять, почему в кваргах не вытаскивается request. Попробуйте просто обратиться к нему через print(kwargs['request']), для начала. Ну и сразу добавьте, print(kwargs['request'].user), на проверку.

Massimo
02.10.2017
08:40:42
попробуйте поменять порядок, поставив AuthenticationMiddleware перед Session. Если верить гугулу, это исправит ошибку с получением user-a. А может и не исправит, глянем. Также, надо понять, почему в кваргах не вытаскивается request. Попробуйте просто обратиться к нему через print(kwargs['request']), для начала. Ну и сразу добавьте, print(kwargs['request'].user), на проверку.
Я точно не понял как, но я смог вытянуть группу, потому что именно она мне и нужна была. Дальше стоит вопрос, почему форма поля не становится той, которую я задаю в init def __init__(self, *args, **kwargs): print(kwargs) grop = kwargs.pop('usar') super(PrimaryForm, self).__init__(*args, **kwargs) if grop == "log-surgut": arrival = DateTimeField(widget=forms.TextInput(attrs={'readonly': 'readonly'}), required=False)

Страница 610 из 1273