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

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

Google

Massimo
02.10.2017
07:02:51

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, то и кода будет не много. Отдельный файлик, где легко, лаконично и просто можно менять поля каждой из групп

Artem
02.10.2017
07:04:49

Andrey
02.10.2017
07:04:55

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

Andrey
02.10.2017
07:08:35

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 - тут это тру решение, или есть лучше?

Massimo
02.10.2017
07:17:41

Dan
02.10.2017
07:19:02

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

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

Serj
02.10.2017
07:24:53

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
или общая модель, пока не понадобится для какого-то типа уникальное поле?

Dan
02.10.2017
07:26:45

Massimo
02.10.2017
07:29:17

Serj
02.10.2017
07:29:38

Dan
02.10.2017
07:30:43

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
я плохо в ясновидение. На какой инстанс? Где? Код, ошибку.

Massimo
02.10.2017
08:00:02

Google

Massimo
02.10.2017
08:00:08
Я сверху кидал

Andrey
02.10.2017
08:09:25
Ну и где инстанс?
Где ошибка?
В чем ошибка? Ругается на инстанс
инстанс чего, кого, где
И, я может и ошибаюсь, но self.arrival, наверное, так надо.
Да и всё-таки надо super().init() делать, иначе остальные поля у вас не проинициализируются. Да и форма не проинициализируется

Massimo
02.10.2017
08:12:49

Andrey
02.10.2017
08:13: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)