Как фильтровать модель при использовании форм в DJango

Здесь мне нужно отобразить type_of_entry на основе клиента, но я получаю type_of_entry всех клиентов

views.py

def item_view(request):
    client = request.user.client  
    log_form = ItemsLogForm()

Вот мои формы

forms.py

class ItemsLogForm(forms.ModelForm):

    class Meta:
        model  = JobItemsLogs
        fields = ('type_of_entry', 'log' )

вот мой models.py

 class ServiceType(models.Model):
     name    = models.CharField(max_length=100,default='Project',null=True, blank=True)
     client = models.ForeignKey(Client)

 class JobItemsLogs(models.Model):
     client = models.ForeignKey(Client)
     type_of_entry = models.ForeignKey("core.ServiceType", blank=True, null=True)
     log = models.TextField(blank=True)

template.html

<form class="form-horizontal" action=" ">
    {% csrf_token %}
    <div class="control-group">

         <div class="controls">

                {{log_form.as_p}}

          </div>
     </div>


  </form>

Рассмотрим таблицу моей базы данных для ServiceType

id    name            client_id

1     Electrical       1
2     Plumbing         3
3     Construction     3

таблица базы данных для JobItemsLogs

id    type_of_entry_id     log

1       2                something  

Теперь мне нужно отобразить type_of_entry (т.е. типы услуг) для client_id = 3 (сантехника, строительство) для определенного журнала nut вместо этого он отображает type_of_entry для client_id = 1 также (означает, что он показывает электрику, сантехнику, строительство)

Пожалуйста, помогите мне написать код, чтобы я показывал тип_записи клиента =3 только

для получения идентификатора клиента в форме сначала отправьте идентификатор в форму

like :

views.py

def item_view(request):
    client = request.user.client  
    log_form = ItemsLogForm(client_id=client.id)

тогда укажите параметр в __init__ в форме типа:

class ItemsLogForm(forms.ModelForm):

    class Meta:
        model  = JobItemsLogs
        fields = ('type_of_entry', 'log' )
    def __init__(self, *args,**kwargs):
        client_id = kwargs.pop("client_id", None) # return None if not set parameter
        super(ItemsLogForm,self).__init__(*args,**kwargs)

Вы можете переписать функцию __ini__ и изменить кверисет поля следующим образом:

def __init__(self, *args,**kwargs):
    client_id = kwargs.pop("client_id", None) # return None if not set parameter
    super(ItemsLogForm,self).__init__(*args,**kwargs)
    self.fields["type_of_entry"].queryset = ServiceType.objects.filter(client__id=client_id)

также вы можете передать клиентский параметр в форму и фильтровать по клиенту вместо client__id

Вернуться на верх