有没有比 ModelMultipleChoiceField 更好的解决方案?

问题描述

我有一个表单,用户可以在其中创建钓鱼之旅,并且可以从注册用户(渔民)中添加多个参与者。

models.py

class Fisherman(models.Model):
    user = models.OnetoOneField(User,on_delete=models.CASCADE)
    fisherman_id = models.AutoField(primary_key=True)

    class Meta:
        verbose_name = "Fisherman"
        verbose_name_plural = "Fishermen"

    def __str__(self):
        return f'{self.user.username}'

class Trips(models.Model):
    lake = models.CharField("Lake",max_length=150)
    city = models.CharField("City",max_length=100,blank=True)
    s_date = models.DateTimeField("Starting Date",auto_Now=False,auto_Now_add=False)
    e_date = models.DateTimeField("Ending Date",auto_Now_add=False)
    fisherman = models.ManyToManyField(Fisherman)
    trip_id = models.AutoField(primary_key=True)
    total_catch_weight = models.DecimalField(max_digits=5,decimal_places=2,default=0)
    
    class Meta:
        verbose_name = "Trip"
        verbose_name_plural = "Trips"

    def __str__(self):
        return f"{self.lake} - {self.trip_id}"

forms.py

class TripsForm(forms.ModelForm):
    fisherman = forms.ModelMultipleChoiceField(queryset=Fisherman.objects.all().exclude(user__username="admin"),widget=forms.SelectMultiple(attrs={'class': 'form-select'}))
    class Meta:
        model = Trips
        fields = ["lake","city","s_date","e_date","fisherman"]
        widgets = {
            "lake": forms.TextInput(attrs={'type': 'text','class': 'form-control','id': 'LakeInput',}),"city": forms.TextInput(attrs={'type': 'text','id': 'CityInput',"s_date": forms.DateTimeInput(format='%Y-%m-%d %H:%M',attrs={'class':'datetimefield form-control','id': 'StartingDate',"e_date": forms.DateTimeInput(format='%Y-%m-%d %H:%M','id': 'EndingDate',}

我目前正在使用 ModelMultipleChoiceField 列出表单中所有现有的渔民,但我想找到更好的解决方案,因为我不希望用户看到所有注册的渔民。

有没有办法通过输入他们的名字来增加更多的渔民?在 manytomanyfield 的情况下有可能吗? 我不知道“打字解决方案”如何运作,因为只有注册的渔民才能加入行程。

解决方法

在这种有很多选择的情况下,我喜欢使用 django_select2 ModelSelect2MultipleWidget

它动态加载选项并具有搜索功能。更多信息:https://django-select2.readthedocs.io/en/latest/index.html