Ограничение выпадающих опций для fireland ForeignKey в ModelForm с CreateView - PullRequest
0 голосов
/ 22 января 2020

У меня есть модель Port с внешним ключом для Device.

При моей текущей настройке форма, отображаемая при создании нового Port, имеет раскрывающийся список со всеми возможными устройствами.

Исходя из URL, я хотел бы иметь возможность

  1. ограничить количество устройств в выпадающем списке только теми, у которых os='unix'

  2. заполнить устройство одним устройством и отключить поле устройства в форме

Я хотел бы сохранить возможность иметь полный раскрывающийся список

Как мне это сделать?

Ниже мой код:

models.py:

class Port(models.Model):
    readonly_fields = ('timestamp', 'created_by')
    form_fields = ('device', 'field1', 'field2', 'field3')
    device = ForeignKey(Device, on_delete=models.CASCADE, db_constraint=False)
    field1 = TextField()
    field2 = TextField()
    field3 = TextField()
    created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    timestamp = models.DateTimeField(auto_now=True, editable=False)

forms.py:

from django.forms import ModelForm
from .models import Port

class PortForm(ModelForm):
    class Meta:
        model = Port
        fields = Port.form_fields
        exclude = ['created_by']

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        self.device = kwargs.pop('device', None)
        super().__init__(*args, **kwargs)

views.py:

class PortView(CreateView):
    model = Port
    template_name = 'port.html'
    form_class = PortForm

    def form_valid(self, form):
        form.instance.created_by = self.request.user
        return super().form_valid(form)

    def form_invalid(self, form):
        form.instance.created_by = self.request.user
        response = super().form_invalid(form)
        return response

    def get_form_kwargs(self, **kwargs):
        kwargs = super().get_form_kwargs(**kwargs)
        device_id = self.kwargs.get('device_id', None)
        if device_id:
            kwargs['device'] = Device(device_id=device_id)
        kwargs['user'] = self.request.user
        return kwargs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...