Easy - 过滤请求用户 ModelForm Choices

Easy - Filtering request user ModelForm Choices

我试图从数据库中获取当前登录用户的数据,而不是所有数据。

有两个模型,一个 Campos 模型可以有多个 Lotes 模型。每个“Campos”和“Lote”都来自一个用户。

当我发布 Lote 时,模板必须过滤 request.user 而不是所有数据库的“Campos”选项。

这是代码

model.py

class Campos (models.Model):
    name = models.CharField(max_length=30)
    user = models.ForeignKey(User, on_delete=models.CASCADE)  
  
    def __str__(self):
        return   self.name

class Lote (models.Model):
    name = models.CharField(max_length=30)  
    user = models.ForeignKey(User, on_delete= models.CASCADE)
    has = models.PositiveIntegerField()
    campo = models.ForeignKey(Campos, on_delete=models.CASCADE)

    def __str__(self):
        return   self.name

** 在 Fomrs.py 我无法查询,它不工作。只是无法在模板中过滤选择 **

forms.py

class LoteForm (forms.ModelForm):
    
    class Meta:
        model = Lote
        fields = [ 'campo','name','has']
        labels = {
            'campo': _('campo'),
            'name': _('Lote'),
            'has': _('Hectareas'),
        }
        def __init__(self, user, *args, **kwargs):
            super(LoteForm, self).__init__(*args, **kwargs)
            self.fields['campo'].queryset = Campos.objects.filter(user=user)

views.py

def campos(request):
    ...

    if request.method =='POST' and 'btn2' in request.POST:
        form_lote = LoteForm(user=request.user, request.POST)
        if form_lote.is_valid():
            Lote = form_lote.save(commit=False)
            Lote.user = request.user
            form_lote.save()
            form_lote = LoteForm()
            return redirect('reporte')

    else:
        ...        
        form_lote = LoteForm(user=request.user)
        
return render (request, 'campos/campos.html',
                {"form": form,
                "form_lote": form_lote,
                })

TAKE A LOOK AT THIS PICTURE

我解决了

FORMS.PY


class LoteForm (forms.ModelForm):

class Meta:
    

    model = Lote
    fields = [ 'campo','name','has']
    labels = {
        'campo': _('campo'),
        'name': _('Lote'),
        'has': _('Hectareas'),
    }

def __init__(self, user, *args, **kwargs):
    super(LoteForm, self).__init__(*args, **kwargs)
    self.fields['campo'].queryset = Campos.objects.filter(user=user)

VIEWS.PY


def campos(请求):

if request.method =='POST'and 'btn1'in request.POST:
    form = CampoForm(request.POST)
    if form.is_valid():
        camp = form.save(commit=False)
        camp.user = request.user
        form.save()
        form = CampoForm()
        return redirect('reporte')

if request.method =='POST' and 'btn2' in request.POST:
    user = request.user
    form_lote = LoteForm(user, request.POST )
    print(form_lote)
    if form_lote.is_valid():
        Lote = form_lote.save(commit=False)
        Lote.user = request.user
        form_lote.save()
        form_lote = LoteForm(user)
        return redirect('reporte')

else:
    form = CampoForm()
    user = request.user
    form_lote = LoteForm(user)


return render (request, 'campos/campos.html',
            {"form": form,
            "form_lote": form_lote,
            })