Форум программистов, компьютерный форум, киберфорум
Python: Django
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 12.09.2016
Сообщений: 13
1

Django m2m (прикрепление нескольких пользователей к 1 задаче)

20.04.2018, 21:50. Показов 1250. Ответов 8

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток. Пишу web-system'у и возникла проблема с записью m2m значений.
Вот моя models:
Python
1
2
3
4
5
6
7
8
9
10
11
class Project(models.Model):
name = models.CharField(max_length = 250)
species = models.ForeignKey('Species_project', on_delete = models.CASCADE)
species_task = models.ForeignKey('Species_Task', on_delete = models.CASCADE)
created_task = models.DateField(verbose_name='Дата создания',auto_now_add=True)
finish_task = models.DateField(verbose_name='Дата окончания')
user = models.ManyToManyField('auth.User')
description = models.TextField()
 
def __str__(self):
    return self.name

вот views:
Python
1
2
3
4
5
6
7
8
9
10
11
12
def create_project_task(request, pk):
task_species = Species_Task.objects.all()
user_list = User.objects.all()
 
if request.method == 'POST':
    name = request.POST.get('name')
    description = request.POST.get('description')
    species_task = request.POST.get('species_task')
    date_finish = request.POST.get('finish_date')
    user_task = request.POST.get('user_task')
    Project.objects.get_or_create(name = name, species_id=pk, species_task_id=species_task, user=user_task, finish_task=date_finish, description=description)
    return render(request, 'projects/create_project_task.html', {'task_species': task_species, 'user_list':user_list})
и сама html от куда я беру значения на запись:

HTML5
1
2
3
4
5
6
<select name="user_task" class="form-control" id="exampleFormControlSelect2" multiple="multiple">{% for itm in user_list %}>
    <option value={{ itm.id }}>
        {{ itm.first_name }}&nbsp{{ itm.last_name }}
    </option>
    {% endfor %}
</select>
У меня не получчается передать несколько значений в request.Post и записать их. Через админ панель все работает,несколько исполнителей прикрепляются к задачам, а вот как сделать это через html и реализовать во view не получается. так же вылетает вот такая ошибка

Direct assignment to the forward side of a many-to-many set is prohibited. Use user.set() instead.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.04.2018, 21:50
Ответы с готовыми решениями:

Авторизация пользователей в Django
{% extends &quot;account/base.html&quot; %} {% load bootstap3 %} &lt;!-- loading &quot;trans&quot; property --&gt; {%...

Модели пользователей Django
День добрый. Стоит задача сделать две модели: продавец и покупатель. Каждый из них может...

Django 2. Распределение прав пользователей
Есть модель. Нужно, чтобы у пользователя были права не ко всем полям, а к определенным (т.е. другие...

Тесты для пользователей Django
Доброго времени суток! Пишу небольшой сервис на Django(параллельно изучая его), сервис будет...

Добавить настройки для пользователей django
Добрый день! Помогите, пожалуйста, разобраться с задачей. Есть страница, которая выдает набор...

8
513 / 145 / 28
Регистрация: 18.04.2015
Сообщений: 1,879
Записей в блоге: 15
20.04.2018, 22:40 2
Цитата Сообщение от Weramax Посмотреть сообщение
class Project(models.Model):
зачем?

может два класса? Три?

первый - прожект
второй - юзер
третий:
дата
юзер
прожект
примечание

?! =)
0
0 / 0 / 0
Регистрация: 12.09.2016
Сообщений: 13
20.04.2018, 23:10  [ТС] 3
Не заметил опечатку
Python
1
2
3
4
5
6
7
8
9
10
11
class Project(models.Model):
    name = models.CharField(max_length = 250)
    species = models.ForeignKey('Species_project', on_delete = models.CASCADE)
    species_task = models.ForeignKey('Species_Task', on_delete = models.CASCADE)
    created_task = models.DateField(verbose_name='Дата создания',auto_now_add=True)
    finish_task = models.DateField(verbose_name='Дата окончания')
    user = models.ManyToManyField('auth.User')
    description = models.TextField()
 
    def __str__(self):
        return self.name
0
513 / 145 / 28
Регистрация: 18.04.2015
Сообщений: 1,879
Записей в блоге: 15
21.04.2018, 06:54 4
Цитата Сообщение от Weramax Посмотреть сообщение
Не заметил опечатку
user = models.ManyToManyField('auth.User')

вот из этого сделать отдельный класс
чтобы не плодить m2m

Python
1
2
3
4
5
class User
    project
    date
    user
    desc
0
0 / 0 / 0
Регистрация: 12.09.2016
Сообщений: 13
21.04.2018, 12:06  [ТС] 5
Цитата Сообщение от IRIP Посмотреть сообщение
вот из этого сделать отдельный класс
чтобы не плодить m2m
Я возможно туплю, новичок пока, но я не понимаю зачем. Я не собираюсь плодить m2m, оно у меня только 1, это когда одна задача может принадлжеать нескольким пользователям. я вывожу пользователей в список, и хочу при выборе передавать их во view, но у меня не получается. уже несколько дней мучаюсь, не могу найти решение.
Можете поподробнее объяснить свой вариант
0
513 / 145 / 28
Регистрация: 18.04.2015
Сообщений: 1,879
Записей в блоге: 15
21.04.2018, 13:30 6
Цитата Сообщение от Weramax Посмотреть сообщение
Можете поподробнее объяснить свой вариант
А если потребуется вывести список задач у пользователя
а не список пользователей в задаче?
0
0 / 0 / 0
Регистрация: 12.09.2016
Сообщений: 13
21.04.2018, 13:36  [ТС] 7
Цитата Сообщение от IRIP Посмотреть сообщение
А если потребуется вывести список задач у пользователя
а не список пользователей в задаче?
Я просто выведу запросом все задачи, где присутствует id авторизованного пользователя
0
0 / 0 / 0
Регистрация: 12.09.2016
Сообщений: 13
22.04.2018, 17:45  [ТС] 8
В общем решил свою проблему сам. Я создал вручную доп. таблицу в модели которая выглядит вот так:

Python
1
2
3
class UserProject(models.Model):
    project = models.ForeignKey(Project, on_delete = models.CASCADE)
    user = models.ForeignKey(User, on_delete = models.CASCADE)
Она принимает в себя id проекта и id пользователя

а потом во views я делаю вот так:

Python
1
2
3
4
5
 user_task = request.POST.getlist('user_task')
    project_task = Project.objects.get_or_create(name = name, species_id=pk,  species_task_id=species_task, finish_task=date_finish, description=description)
 
    for itm in user_task:
            UserProject.objects.get_or_create(project = project_task[0], user_id = int(itm))
записываю в list id всех пользователей, в project_task, после записи в бд, так же хранится id проекта, у них в кортеже 0 номер эллемента, а потом с помощью цикла for записываем в нашу доп. таблицу. Вот и все, оказалось все горазда легче, нужно было всего лишь прочитать документацию
0
513 / 145 / 28
Регистрация: 18.04.2015
Сообщений: 1,879
Записей в блоге: 15
22.04.2018, 18:40 9
а что за приложение делаешь?
0
22.04.2018, 18:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.04.2018, 18:40
Помогаю со студенческими работами здесь

Как сделать привелегии для пользователей? Django
Всем привет, подскажите как реализовать данную идею. Проект должен обеспечивать четыре уровня...

Django - загрузка нескольких фото одновременно
Добрый день! models.py class Location(models.Model): user =...

Django вывод данных с нескольких вьюх
Доброго времени суток. Я тут немного учусь джанге и решил начать с блога. Вопрос чутка глуповатый,...

Django: получение нескольких элементов из модели
Нужно получить несколько элементов из BlogPost.objects но как не знаю. в Notepad++/NetBeans не...

Django доступ к базе данных на нескольких серверах
Добрый вечер! Собственно такова ситуация, есть несколько vps серверов, одна база данных на...

[solved] STM32F103Z, DMA, m2m
Вот такая проблема случилась - никак не могу пнуть DMA Что я хочу - LCD экранчик приделан к FSMC...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru