У меня есть модель Port
с внешним ключом для Device
.
При моей текущей настройке форма, отображаемая при создании нового Port
, имеет раскрывающийся список со всеми возможными устройствами.
Исходя из URL, я хотел бы иметь возможность
ограничить количество устройств в выпадающем списке только теми, у которых os='unix'
заполнить устройство одним устройством и отключить поле устройства в форме
Я хотел бы сохранить возможность иметь полный раскрывающийся список
Как мне это сделать?
Ниже мой код:
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