Как фильтровать модель при использовании форм в 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