Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django ModelChoiceField:基于url中的pk筛选对象_Django_Django Views_Django Forms_Django Class Based Views_Django Generic Views - Fatal编程技术网

Django ModelChoiceField:基于url中的pk筛选对象

Django ModelChoiceField:基于url中的pk筛选对象,django,django-views,django-forms,django-class-based-views,django-generic-views,Django,Django Views,Django Forms,Django Class Based Views,Django Generic Views,我读过很多关于这个话题的问题,但是没有一种方法适合我 class NewCatchView(CreateView): model = Catch form_class = CatchForm template_name = "new_trip/new_catch.html" # Probably, this is wrong def get_form_kwargs(self): kwargs = super()

我读过很多关于这个话题的问题,但是没有一种方法适合我

class NewCatchView(CreateView):
    model = Catch
    form_class = CatchForm
    template_name = "new_trip/new_catch.html"
    
    # Probably, this is wrong
    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['fisherman'] = Fisherman.objects.filter(trip=self.kwargs.get('pk'))
        return kwargs
    
    def form_valid(self, form):
        form.instance.trip = Trips.objects.get(pk=self.kwargs['pk'])
        return super().form_valid(form)

    def get_success_url(self):
        return reverse('new_trip:trip_details', args=(self.kwargs['pk'],))

有3个相关模型:

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=False, auto_now_add=False)
    trip_id = models.AutoField(primary_key=True)    

    class Meta:
        verbose_name = "Trip"
        verbose_name_plural = "Trips"

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

class Fisherman(models.Model):
    name = models.CharField("Fisherman", max_length=50)
    trip = models.ForeignKey(Trips, 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.name}-{self.fisherman_id}"


class Catch(models.Model):
    fish_type = models.CharField("Fish Type", max_length=50)
    catch_id = models.AutoField(primary_key=True)
    weight = models.DecimalField("Weight", max_digits=5, decimal_places=2)
    length = models.DecimalField("Length", max_digits=5, decimal_places=2, blank=True, null=True)
    datetime = models.DateTimeField("Catch Time", auto_now=False, auto_now_add=False)
    fisherman = models.ForeignKey(Fisherman, on_delete=models.CASCADE)
    trip = models.ForeignKey(Trips, on_delete=models.CASCADE)

    class Meta:
        verbose_name = "Catch"
        verbose_name_plural = "Catches"

    def __str__(self):
        return f"{self.fish_type}-{self.catch_id}"
我有一个模型来创建一个新的捕获。在这里,我使用ModelChoiceField列出渔民,但我不知道如何筛选他们。我只想展示那些属于这次旅行的人

class CatchForm(forms.ModelForm):
    fisherman = forms.ModelChoiceField(queryset= Fisherman.objects.all())
    class Meta:
        model = Catch
        fields = ["fish_type", "weight", "length", "datetime", "fisherman"]
        widgets = {
            "datetime": forms.DateTimeInput(format='%Y-%m-%d %H:%M', attrs={'class':'datetimefield form-control'}),
        }
views.py

我已经读过,get_form_kwargs应该在视图中用于覆盖表单中的字段,但它对我不起作用

class NewCatchView(CreateView):
    model = Catch
    form_class = CatchForm
    template_name = "new_trip/new_catch.html"
    
    # Probably, this is wrong
    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['fisherman'] = Fisherman.objects.filter(trip=self.kwargs.get('pk'))
        return kwargs
    
    def form_valid(self, form):
        form.instance.trip = Trips.objects.get(pk=self.kwargs['pk'])
        return super().form_valid(form)

    def get_success_url(self):
        return reverse('new_trip:trip_details', args=(self.kwargs['pk'],))

url.py

path("trip_details/<int:pk>/new_catch/", views.NewCatchView.as_view(), name="new_catch"),
path(“trip\u details//new\u catch/”,views.NewCatchView.as\u view(),name=“new\u catch”),

提前感谢您的帮助

你就快到了。您已经创建了kwarg,因此现在只需在表单中使用它来覆盖原始查询集:

类CatchForm(forms.ModelForm):
...
定义初始化(self,*args,**kwargs):
fisherman=kwargs.pop('fisherman')
super()
self.fields['fisherman'].queryset=fisherman

谢谢!现在它开始工作了。