问题描述
我有一个表单,用户可以在其中创建钓鱼之旅,并且可以从注册用户(渔民)中添加多个参与者。
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