ФорумПрограммированиеPythonDjango → редактирование many to many с дополнительными полями

редактирование many to many с дополнительными полями

  • Dreamer

    Сообщения: 82 Репутация: N Группа: Адекваты

    Spritz 29 марта 2015 г. 4:04

    Доброго дня
    В общем нужно создать меню из данных блюд, но с динамическими ценами (сегодня пирожок стоит 5 рублей, затра - 10, послезавтра - 6.50 и тд по настроению продавца)

    models.py

    
    class Menu(models.Model):
        day = models.OneToOneField( Day )
        dishes = models.ManyToManyField( Dish, through='MenuDishes' )
    
    class MenuDishes(models.Model):
        menu = models.ForeignKey(Menu)
        dish = models.ForeignKey(Dish)
        price = models.DecimalField(...)
    

    views.py

    
    class MenuCreate(CreateView):
        model = Menu
        ...
    

    form.html

    
    {% extends "base.html" %}
    
    {% block content %}
        <form method="POST">
            {% csrf_token %}
            {{form}}
            <input type="submit" value="{{submit_text}}">
        </form>
    {% endblock content %}
    

    Выводится только выбор дня, и multiple select для выбора блюд... Как сделать, чтобы появилось поле цены?

  • Sinkler

    Сообщения: 9658 Репутация: N Группа: в ухо

    Spritz 29 марта 2015 г. 7:33, спустя 3 часа 28 минут 37 секунд

    @Dreamer, тут стандартная модельная форма не пойдёт, если нужно всё на одной странице, нужно сделать добавление записей сначала в MenuDishes, например, через ajax, потом получившиеся записи связывать с новой записью в Menu

  • Dreamer

    Сообщения: 82 Репутация: N Группа: Адекваты

    Spritz 29 марта 2015 г. 8:27, спустя 53 минуты 58 секунд

    @Sinkler, а можно к событию открытия страницы привязаться? что-то вроде find_or_create? и куда эту обработку пихать во вьюхе?

    PS скорее мне придется сначала Menu создавать, а потом уже связи аяксом прикручивать

  • Sinkler

    Сообщения: 9658 Репутация: N Группа: в ухо

    Spritz 29 марта 2015 г. 8:56, спустя 29 минут 51 секунду

    @Dreamer,

    скорее мне придется сначала Menu создавать, а потом уже связи аяксом прикручивать

    ну да, так

    во вьюхе зависит от реализации, проще всего сначала создать Menu, потом отдельную вьюху для добавления MenuDishes: либо по одной записи добавлять за раз, и работать как с обычными формами создания, либо страницу, которая будет добавлять записи через ajax, что более юзабельно для конечного пользователя, тогда во вьюхе обработки ajax-запроса просто принимать поля формы и создавать запись в модели MenuDishes

  • Dreamer

    Сообщения: 82 Репутация: N Группа: Адекваты

    Spritz 29 марта 2015 г. 9:51, спустя 54 минуты 31 секунду

    @Sinkler, ага, спасибо

  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 29 марта 2015 г. 16:07, спустя 6 часов 16 минут 19 секунд

    forms.py

    class MenuForm(forms.ModelForm):
        price = forms.CharField()
    
        class Meta:
            model = Menu
    

    views.py

    class MenuCreate(FormView):
        form_class = MenuForm
    
    adw/0
  • Dreamer

    Сообщения: 82 Репутация: N Группа: Адекваты

    Spritz 30 марта 2015 г. 2:36, спустя 10 часов 29 минут

    @adw0rd, Сделал немного иначе - при загрузке

    
       ...
       def get_context_data(self, **kwargs):
          ...
          day_id = self.kwargs.get("day_id")
          menu, created = Menu.objects.get_or_create(day_id=day_id)
          ...
    

    В шаблоне, скрытые id и day_id, остальные данные думаю разберусь как обработать.

    Получилось это:

  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 30 марта 2015 г. 2:50, спустя 13 минут 53 секунды

    @Dreamer, получается что меню всегда создается, даже если не сохранять форму? Ну если это не критично, то можно и так

    adw/0
  • Dreamer

    Сообщения: 82 Репутация: N Группа: Адекваты

    Spritz 30 марта 2015 г. 3:16, спустя 26 минут 16 секунд

    @adw0rd, да, пожалуй, не критично

    Спустя 184 сек.

    добавил атрибут active

  • Dreamer

    Сообщения: 82 Репутация: N Группа: Адекваты

    Spritz 7 апреля 2015 г. 6:35, спустя 8 дней 3 часа 18 минут

    В общем вырисовалась еще одна проблема.
    К задаче добавился выбор из меню для каждого пользователя.

    models.py

    
    class Menu(models.Model):
        day = models.OneToOneField( Day )
        dishes = models.ManyToManyField( Dish, through='MenuDishes' )
    
    class MenuDishes(models.Model):
        menu = models.ForeignKey(Menu)
        dish = models.ForeignKey(Dish)
        price = models.DecimalField(...)
    
    class MenuUserChoise(models.Model):
        user = models.ForeignKey(User)
        dishes = models.ManyToManyField( MenuDishes, through='MenuUserDishesChoise' )
    
    class MenuUserDishesChoise(models.Model):
        choise = models.ForeignKey(MenuUserChoise)
        dish = models.ForeignKey(MenuDishes)
        count = models.IntegerField(...)
    

    view.py

    
    def user_dish_choise(request, **kwargs):
        pk = kwargs['pk']
        return render(request, '/menu/user_choise.html', {
            'dishes': MenuUserChoise.objects.get(pk=pk).dishes.all()
        })
    

    user_choise.html

    
    {% for dish in dishes %}
        {{dish}}
    {% endfor %}
    

    Получаю

    MenuDishes object

    Как вместо MenuDishes получить MenuUserDishesChoise, который я собственно и пытаюсь получить?

  • Dreamer

    Сообщения: 82 Репутация: N Группа: Адекваты

    Spritz 7 апреля 2015 г. 6:43, спустя 8 минут 9 секунд

    Разобрался

    
    MenuUserChoise.objects.get(pk=pk).menuuserdisheschoise_set.all()
    
  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 7 апреля 2015 г. 7:54, спустя 1 час 11 минут 7 секунд

    Разобрался

    
      MenuUserChoise.objects.get(pk=pk).menuuserdisheschoise_set.all()
      

    @Dreamer, адовые имена, лечше юзай related_name:

    class Account(models.Model):
        user = models.ForeignKey(User, related_name=&#39;accounts&#39;)
    
    User.objects.get(pk=pk).accounts.all()
    
    adw/0
  • Dreamer

    Сообщения: 82 Репутация: N Группа: Адекваты

    Spritz 10 апреля 2015 г. 6:15, спустя 2 дня 22 часа 20 минут

    @adw0rd, вообще related_name юзаю, просто в здесь пропустил.

    ЗЫ На всё про всё полторы недели было, и это мой первый проект на django... Поэтому там много мест, где код можно улучшить.

  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 10 апреля 2015 г. 6:20, спустя 5 минут 19 секунд

    @Dreamer, ты спрашивай, мы поможем. Адекватам всегда хочется помогать

    adw/0

Пожалуйста, авторизуйтесь, чтобы написать комментарий!