Фильтр запросов внутри формы - PullRequest
2 голосов
/ 07 апреля 2020

У меня есть одно приложение, которое содержит список рабочих заданий, и другое приложение, которое содержит список деталей.

class Order(models.Model):
  parts = models.ManyToManyField(Part, blank=True) # Assosiated parts

class Part(models.Model):
  partnum = models.CharField(max_length=20) # Part number
  mwos = models.ManyToManyField('mtn.Order', blank=True) # Assosiated work orders

Теперь я хочу добавить кнопку в мой DetailView для заказа, который откроется. список деталей, которые я смогу добавить к своему заказу. На данный момент у меня есть UpdateView для моего заказа

class AddPartView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):   
    model = Order
    form_class = AddPartForm
    ...   

и форма

class AddPartForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = ['parts', ]
        labels = {'parts': "Parts", }

    def FilterList(request):
        qs = Part.objects.all()
        search_part_query = request.GET.get('search_part')

        if is_valid_queryparam(search_part_query):
            qs = qs.filter(Q(partnum__icontains=search_part_query) 
                | Q(descr__icontains=search_part_query)
                ).distinct()

        return qs         

    def __init__(self, *args, **kwargs):

        super(AddPartForm, self).__init__(*args, **kwargs)

        self.fields["parts"].widget = CheckboxSelectMultiple()
        self.fields["parts"].queryset = self.FilterList()

для этого шаблона

{% block content %}

  <form method="GET" action=".">
    <div class="form-row justify-content-start">
      <div class="form-group col-md align-self-center">
        <div class="input-group">
          <input class="form-conrol py-2 border-right-0 border" type="search" placeholder="Find part" name="search_part">
            <span class="input-group-append">
              <div class="input-group-text bg-transparent">
                <i class="fa fa-search"></i>
              </div>
            </span>                      
        </div>
      </div>            
    </div>
    <button type="submit" class="btn btn-primary btn-sm btn-block">Search</button>    
  </form>

  <form action="{% url 'mtn:add_part' order.id %}" method='post'>
    {% csrf_token %}
    {{ form.as_p }}  
    <button type="submit">Save</button>
  </form>

{% endblock content %}

Но когда я Я выполняю это, я получаю 'AddPartForm' object has no attribute 'GET' ошибку.

Я новичок в программировании, так что, возможно, я подхожу к этому неправильный путь.

1 Ответ

2 голосов
/ 07 апреля 2020

Форма обычно не знает об объекте request. Вы можете создать такую ​​форму, например, с помощью:

class AddPartForm(forms.ModelForm):
    class Meta:
        model = Order
        fields = ['parts', ]
        labels = {'parts': "Parts", }
        widgets = {
            'parts': CheckboxSelectMultiple
        }

    def filter_list(self, request):
        qs = Part.objects.all()
        search_part_query = request.GET.get('search_part')

        if is_valid_queryparam(search_part_query):
            qs = qs.filter(Q(partnum__icontains=search_part_query) 
                | Q(descr__icontains=search_part_query)
                ).distinct()

        return qs         

    def __init__(self, *args<b>, request=None</b>, **kwargs):
        super(AddPartForm, self).__init__(*args, **kwargs)
        self.fields["parts"].queryset = self.filter_list(<b>request</b>)

В AddPartView вы можете передать request в качестве параметра в форму, переопределив .get_form_kwargs(..) метод [Django -док]

class AddPartView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):   
    model = Order
    form_class = AddPartForm

    def <b>get_form_kwargs</b>(self):
        kwargs = super().get_form_kwargs()
        kwargs.update(<b>request=self.request</b>)
        return kwargs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...