Ответы пользователя по тегу Django
  • Как загрузить несколько файлов из формы в DJANGO?

    ruchej
    @ruchej Автор вопроса
    Конструктор мебели. Пишу макросы для К3-Мебель
    Принял такое решение данной задачи. За основу был взять пример из документации.
    Суть решения.
    Есть две модели: одна это поля для формы связи, вторая хранение файлов.
    В файле forms.py пишем класс на основе модели contact. Добавляем поле files со свойствами мультизагрузки.
    В представлении получаем список файлов files = request.FILES.getlist('files'). После проверки правильности заполнения формы if form.is_valid() сохраняем содержимое в базу и получаем id этой записи id = form.save().pk. Далее получаем объект contact согласно полученному id - contact = Contact.objects.get(pk=id). Для этого объекта, циклом записываем полученные файлы fl = Files(contact=contact, file = f).
    models.py
    from django.db import models
    
    
    class Contact(models.Model):
    
        name = models.CharField(max_length=50, verbose_name='Имя')
        phone = models.CharField(max_length=50, verbose_name='Телефон')
        email = models.EmailField(max_length=50, blank=True, verbose_name='email')
        body = models.TextField(verbose_name='Текст сообщения')
    
        class Meta:
            verbose_name = "Контакт"
            verbose_name_plural = "Контакты"
    
        def __str__(self):
            return "{} {}".format(self.name, self.phone)
    
    
    
    class Files(models.Model):
    
        file = models.FileField(upload_to='contact', blank=True, null=True, verbose_name='Файл')
        contact = models.ForeignKey(Contact, blank=True, null=True, on_delete=models.CASCADE)
    
        class Meta:
            verbose_name = "Файлы"
            verbose_name_plural = "Файлы"
    
        def __str__(self):
            return self.file.name

    view.py
    from django.views.generic.edit import FormView
    from .forms import ContactForm
    from .models import Contact, Files
    import pdb # pdb.set_trace()
    
    class ContactView(FormView):
        form_class = ContactForm
        template_name = 'contact.html'
        success_url = '#' # адрес страницы успеха отправки формы
    
        def post(self, request, *args, **kwargs):
            form_class = self.get_form_class()
            form = self.get_form(form_class)
            files = request.FILES.getlist('files')
            if form.is_valid():
                id = form.save().pk
                contact = Contact.objects.get(pk=id)
                if files:
                    for f in files:
                        fl = Files(contact=contact, file = f)
                        fl.save()
                return self.form_valid(form)
            else:
                return self.form_invalid(form)

    forms.py
    from django import forms
    
    from .models import Contact
    
    
    class ContactForm(forms.ModelForm):
    
        files = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}), required=False)
    
        class Meta:
            model = Contact
            fields = ('name', 'phone', 'email', 'body')

    Ответ написан
  • Как отобрать посты по статусу?

    ruchej
    @ruchej Автор вопроса
    Конструктор мебели. Пишу макросы для К3-Мебель
    На данный момент нашёл такое решение.
    Изменил во view.py строку
    Post.published.all()
    на
    Post.published.filter(rubric__status="published")
    Надеюсь это верное решение. По крайней мере, результат тот, что ожидал.
    Решение нашёл в документации по django

    Для сортировки по полю из другой модели, используйте синтаксис аналогичный тому, который используется при фильтрации по полям связанной модели. То есть, название поля, далее два нижних подчеркивания (__), и имя поля в новой модели, и так далее. Например:

    Entry.objects.order_by('blog__name', 'headline')
    Ответ написан
    Комментировать
  • Как в django сверстать письмо?

    ruchej
    @ruchej
    Конструктор мебели. Пишу макросы для К3-Мебель
    Подскажите, как быть со стилями? Стили тоже в шаблон интегрировать, а не хранить в css?
    Ответ написан
    Комментировать
  • Как в django определить, что запрос ajax XMLHttpRequest?

    ruchej
    @ruchej Автор вопроса
    Конструктор мебели. Пишу макросы для К3-Мебель
    Так как ajax запрос делал на javascript, а не на jQuery, то надо было руками дописать в заголовок запроса нужный атрибут, что бы django определил request.is_ajax()
    fetch('http://127.0.0.1:8000/main/katalog/5/', {
                  method: 'GET',
                  headers: {'X-Requested-With': 'XMLHttpRequest'}});
    Ответ написан
    Комментировать
  • Как работать с объектом модели в шаблоне?

    ruchej
    @ruchej Автор вопроса
    Конструктор мебели. Пишу макросы для К3-Мебель
    Всех благодарю!
    Хороший был совет данные готовить в методе модели.
    В models.py модели FurnitureProduct добавил метод
    def get_images_path(self):
            im_path = []
            imobj = Images.objects.filter(furnproduct_id=self.pk)
            if imobj:
                for obj in imobj:
                    im_path.append(obj.imagepath.url)
            return im_path

    И в шаблоне получаю список значений методом: {{ product.get_images_path }}
    Я новичок, мне и в голову такое не пришло.
    Ответ написан
    Комментировать
  • Как назначать тип содержания меню?

    ruchej
    @ruchej Автор вопроса
    Конструктор мебели. Пишу макросы для К3-Мебель
    Благодарю за помощь.
    Пока решил пойти следующим способом.
    Т.к. макет сайта и его содержимое должны изначально прорабатываться, то и разделы меню должны изначально определены. Например, имеем главные меню: главная, каталог, интересное, о компании.
    Для меню "каталог" я сделал так.
    Создана модель Catalog. В неё заносятся каталоги товара с подкаталогами. Тут использовал mptt. В результате могу получить каталог Кухни с подкаталогами: пластик, шпон и т.д.
    При создании макета страницы, к меню "Каталог" я подключаю списки дерева из модели Catalog используя mptt. Ссылки на каждый раздел каталога это id в БД. Далее уже через вьюшку обрабатываю эти ссылки, как в уроке официальной документации.
    Так всё-таки проще, к тому же админка это не конструктор сайта, как джумла.

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