powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Фильтр в виджете Select формы Django
18 сообщений из 18, страница 1 из 1
Фильтр в виджете Select формы Django
    #40103973
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день! Подскажите, как можно сделать? Есть форма, связанная с моделью. В форме элемент Select, выбор типа документа (Приход, Расход,Списание). Этот Select берет данные из таблицы типов документов. При запуске формы отображаются все записи из таблицы, а мне надо, допустим, чтобы в этом элементе отображались данные из таблицы по определенному фильтру. Например, только "Приход" и "Списание". Спасибо.
...
Рейтинг: 0 / 0
Фильтр в виджете Select формы Django
    #40104063
iot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iot
Гость
Jimy,

Добрый день.

можно ограничить на уровне queryset со стороны модели по условию через filter;
использовать slice в шаблоне.
в обоих случаях, будет более гибко, если есть определённый статус внутри этой модели для соответствующей фильтрации.
...
Рейтинг: 0 / 0
Фильтр в виджете Select формы Django
    #40104069
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я вот так пробовал.. Но в форме при выборе в select все равно отображаются все записи из таблички DocType... Что я не так делаю?

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
def CreateNewDoc(request):
        typedoc=TypeDoc.objects.filter(pk=2)
        form = DocForm(request.POST,initial={'typedoc':typedoc})
        if form.is_valid():
            form.save()
            return redirect('DocList')
           # return render(request, "trade/DocPage.html", context)
        else:
            typedoc = TypeDoc.objects.filter(pk = 2)
            doc=Doc.objects.all()
            form = DocForm(initial={'typedoc':typedoc})
            context = {'Doc': doc, 'form': form }
            return render(request, "trade/CreateNewDocHeader.html", context)
...
Рейтинг: 0 / 0
Фильтр в виджете Select формы Django
    #40104192
iot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iot
Гость
Jimy,

покажите select внутри html шаблона
...
Рейтинг: 0 / 0
Фильтр в виджете Select формы Django
    #40104263
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот кусок HTML c формой:
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<form action="" method="post" enctype="multipart/form-data">
   {% csrf_token %}
    <div class="form-row ">
<div class="col ">
    {{form.nomerdoc}}
</div>
<td>
  <div class="col ">
      <span class="mt-1"> {{form.datadoc}}</span>
</div>
</td>
  <td>
  <div class="col ">
      <span class="mt-1"> {{form.typedoc}}</span>
</div>
</td>
 <td>
  <div class="col ">
      <span class="mt-1"> {{form.dealer}}</span>
</div>
</td>



а вот forms...
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class DocForm(forms.ModelForm):
    class Meta:
        model=Doc
        #fields='__all__'
        fields=['nomerdoc','datadoc','dealer','typedoc']
        widgets={
            'nomerdoc':forms.TextInput(attrs={'class':'form-control'}),
            'datadoc':MyDateInput(attrs={'class':'form-control '}),
            'dealer':forms.Select(attrs={'class':'form-control'}),
            'typedoc': forms.Select(attrs={'class': 'form-control'}),
        }



Вот модель, для которой форма...
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
class Doc(models.Model):
    nomerdoc=models.CharField(max_length=20,verbose_name="Номер документв")
    datadoc=models.DateField(verbose_name='Дата документа')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='Создан')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='Обновлен')
    dealer=models.ForeignKey(Dealer,verbose_name='Поставщик',on_delete=models.PROTECT)
    buytotal=models.DecimalField(max_digits=8,decimal_places=2,blank=True,null=True,default=0.00)
    saletotal=models.DecimalField(max_digits=8,decimal_places=2,blank=True,null=True,default=0.00)
    transaction=models.BooleanField(verbose_name='Проведен',default=False)
    typedoc=models.ForeignKey(TypeDoc,verbose_name='Тип документа',on_delete=models.PROTECT)



А вот модель типа документа. Вот из неё хотелось отбирать данные для selecta. Например, при создании нового документа ограничить селект пунктами Поступление и Ввод начальных остатков и не показывать, допустим, тип документа Кассовый чек...
Код: python
1.
2.
3.
4.
class TypeDoc(models.Model):
    title=models.CharField(max_length=70,verbose_name='Тип документа')
    def __str__(self):
        return self.title
...
Рейтинг: 0 / 0
Фильтр в виджете Select формы Django
    #40104392
iot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iot
Гость
Jimy,

попробуйте так
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
def CreateNewDoc(request):
        typedoc=TypeDoc.objects.filter(pk=2)
        form = DocForm(request.POST,initial={'typedoc':typedoc})
        if form.is_valid():
            form.save()
            return redirect('DocList', typedoc=typedoc)
        else:
            doc=Doc.objects.all()
            form = DocForm(initial={'typedoc':typedoc})
            context = {'Doc': doc, 'form': form }
            return render(request, "trade/CreateNewDocHeader.html", context)


и проверьте, что именно эта форма во всех шаблонах
...
Рейтинг: 0 / 0
Фильтр в виджете Select формы Django
    #40104396
iot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iot
Гость
iot
Jimy,

попробуйте так
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
def CreateNewDoc(request):
        typedoc=TypeDoc.objects.filter(pk=2)
        form = DocForm(request.POST,initial={'typedoc':typedoc})
        if form.is_valid():
            form.save()
            return redirect('DocList', typedoc=typedoc)
        else:
            doc=Doc.objects.all()
            form = DocForm(initial={'typedoc':typedoc})
            context = {'Doc': doc, 'form': form }
            return render(request, "trade/CreateNewDocHeader.html", context)


или так
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
def CreateNewDoc(request):
        typedoc=TypeDoc.objects.filter(pk=2)
        form = DocForm(request.POST,initial={'typedoc':typedoc})
        if form.is_valid():
            form.save()
            return redirect('DocList', form=form)
        else:
            doc=Doc.objects.all()
            context = {'Doc': doc, 'form': form }
            return render(request, "trade/CreateNewDocHeader.html", context)
...
Рейтинг: 0 / 0
Фильтр в виджете Select формы Django
    #40104611
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответ, но никаких изменений...:(( Наверное, пойду другим путем - буду делать отдельную форму по каждый тип документа... А все таки интересно, почему отображаются все данные из таблицы и нет фильтрации? Может, есть другое решение?
...
Рейтинг: 0 / 0
Фильтр в виджете Select формы Django
    #40104614
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще я хочу, чтобы при выборе типа документа из формы были доступны только первые три пункта, а остальные вообще отсутствовали в Select Как это сделать?
...
Рейтинг: 0 / 0
Фильтр в виджете Select формы Django
    #40104615
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таблице TypeDoc на самом деле будет больше записей, но в select формы нужны только первые три, как на картинке...
...
Рейтинг: 0 / 0
Фильтр в виджете Select формы Django
    #40104821
iot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iot
Гость
Jimy
В таблице TypeDoc на самом деле будет больше записей, но в select формы нужны только первые три, как на картинке...

в первом сообщении давал ссылку, будет примерно так
Код: python
1.
{{ typedoc|slice:":2" }}
...
Рейтинг: 0 / 0
Фильтр в виджете Select формы Django
    #40104888
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо большое! Признаюсь, ссылку не заметил...
...
Рейтинг: 0 / 0
Фильтр в виджете Select формы Django
    #40105082
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все равно что-то не то... Применяю slice в шаблоне с формой:
Код: python
1.
2.
3.
4.
5.
<td>
  <div class="col ">
      <span class="mt-1"> {{form.typedoc|slice:":2"}}</span>
</div>
</td> 


Вот такой результат вместо значений:

Код: python
1.
[<django.forms.boundfield.BoundWidget object at 0x03C14FF0>, <django.forms.boundfield.BoundWidget object at 0x03C148F0>]
...
Рейтинг: 0 / 0
Фильтр в виджете Select формы Django
    #40105089
iot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iot
Гость
Jimy,

попробуйте изменить queryset

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
class DocForm(forms.ModelForm):
    class Meta:
        model=Doc
        fields=['nomerdoc','datadoc','dealer','typedoc']
        widgets={
            'nomerdoc':forms.TextInput(attrs={'class':'form-control'}),
            'datadoc':MyDateInput(attrs={'class':'form-control '}),
            'dealer':forms.Select(attrs={'class':'form-control'}),
            'typedoc': forms.Select(attrs={'class': 'form-control'}),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['typedoc'].queryset = TypeDoc.objects.filter(id__lt=3)



если не поможет, можно ещё попробовать указать choices
...
Рейтинг: 0 / 0
Фильтр в виджете Select формы Django
    #40105120
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению, вариант с queryset не дал результатов... А как использовать choice? Не разу им не пользовался, в качестве примера решил попробовать, но явно что то не так, изменений нет...
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class DocForm(forms.ModelForm):

    class Meta:
        model=Doc
        #fields='__all__'
        CHOICES = [('1', 'First'), ('2', 'Second')]
        fields=['nomerdoc','datadoc','dealer','typedoc']
        widgets={
            'nomerdoc':forms.TextInput(attrs={'class':'form-control'}),
            'datadoc':MyDateInput(attrs={'class':'form-control '}),
            'dealer':forms.Select(attrs={'class':'form-control'}),
            'typedoc': forms.Select(attrs={'class': 'form-control','choises':CHOICES})
        }
...
Рейтинг: 0 / 0
Фильтр в виджете Select формы Django
    #40105137
iot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iot
Гость
Jimy,

Код: python
1.
'typedoc': forms.Select(attrs={'class': 'form-control'},choises=CHOICES)
...
Рейтинг: 0 / 0
Фильтр в виджете Select формы Django
    #40105293
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ух... Замучил уже и себя и Вас... Но вот что получается:
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class DocForm(forms.ModelForm):

    class Meta:
        CHOICES = [('1', 'First'), ('2', 'Second')]
        model=Doc
        fields=['nomerdoc','datadoc','dealer','typedoc']
        widgets={
            'nomerdoc':forms.TextInput(attrs={'class':'form-control'}),
            'datadoc':MyDateInput(attrs={'class':'form-control '}),
            'dealer':forms.Select(attrs={'class':'form-control'}),
            'typedoc': forms.Select(attrs={'class': 'form-control'},choises=CHOICES)
        }


В терминале ошибка:

Код: python
1.
2.
3.
File "C:\HT\hotel\trade\forms.py", line 100, in Meta
    'typedoc': forms.Select(attrs={'class': 'form-control'},choises=CHOICES)
TypeError: __init__() got an unexpected keyword argument 'choises'
...
Рейтинг: 0 / 0
Фильтр в виджете Select формы Django
    #40105311
iot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iot
Гость
Jimy
В терминале ошибка:
Код: python
1.
2.
3.
File "C:\HT\hotel\trade\forms.py", line 100, in Meta
    'typedoc': forms.Select(attrs={'class': 'form-control'},choises=CHOICES)
TypeError: __init__() got an unexpected keyword argument 'choises'


возможно версия django другая.
queryset всё же попробуйте подменить
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Фильтр в виджете Select формы Django
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]