Search code examples
djangoformsfilterdjango-queryset

Django get current id to compare two tables in queryset filter


I'm struggling to achieve a simple queryset filter because i can't find how to get the current id of my form.

view.py

def update_record(request, pk):
    if request.user.is_authenticated:
        current_record = Record.objects.get(id=pk)
        form = AddRecordForm(request.POST or None, instance=current_record)
        if form.is_valid():
            form.save()
            messages.success(request, "Record Has Been Updated!")
            return redirect('home')
        return render(request, 'update_record.html', {'form':form})
    else:
        messages.success(request, "You Must Be Logged In...")
        return redirect('home')

forms.py

class AddRecordForm(forms.ModelForm):
    testrever = forms.ModelMultipleChoiceField(widget=forms.widgets.SelectMultiple, queryset=BDC.objects.filter(ref = ???current.id.of.Record.model???).values_list('model'))

    class Meta:
        model = Record
        exclude = ("user",)



class BDCform(forms.ModelForm):
    ref = forms.CharField(required=False, widget=forms.widgets.TextInput(attrs={"placeholder":"First Name", "class":"form-control"}), label="")
    model = forms.CharField(required=False, widget=forms.widgets.TextInput(attrs={"placeholder":"Last Name", "class":"form-control"}), label="")

    class Meta:
        model = BDC
        exclude = ("user",)

models.py

    class Record(models.Model):
        id = models.CharField(primary_key=True, max_length=50)
        testrever = models.JSONField(max_length=500) 
    
        def __str__(self):
            return (f"{self.first_name} {self.last_name}")

    class BDC(models.Model):
        ref = models.CharField(max_length=50)
        model = models.CharField(max_length=50)

My problem is in this line in forms.py:

queryset=BDC.objects.filter(ref = ???current.id.of.Record.model??? ).values_list('model')

How can i get the current ID of the Record form to compare it with "ref" of BDC form so i can populate the widget with the results ?

Thanks


Solution

  • this what i did to fix the probleme :

    def __init__(self, *args, **kwargs):
        self.storage_pk = kwargs.pop('pk')
        super(AddRecordForm, self).__init__(*args, **kwargs)
        self.fields['testrever'].queryset = BDC.objects.filter(ref=self.storage_pk).values_list('model', flat=True)
    

    and modified

    testrever = forms.ModelMultipleChoiceField(widget=forms.widgets.SelectMultiple, queryset=None)