Selamat malam,

Apakah mungkin untuk mengubah ModelForm di dalam form.py saya, sehingga nilai yang sudah diketahui disimpan di dalam database? Sebagai contoh:

Model.py:

class Customer(models.Model):
    name = models.CharField(max_length=255)

class Project(models.Model):
    customer = models.ForeignKey(Customer, null=False, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)

class Entry(models.Model):
    user = ...request.user.id?...
    customer = models.ForeignKey(Customer, null=False, on_delete=models.CASCADE)
    project= models.ForeignKey(Project, null=False, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)

Form.py:

class EntryForm(ModelForm):
    class Meta:
        model = Entry
        fields = '__all__'

    def __init__(self, *args, pk, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['project'].queryset = Project.objects.filter(customer_id=pk)

Saat memasuki situs tahu, saya sudah tahu tentang satu-satunya Pelanggan yang mungkin (pk)! Saya tidak ingin menempatkan bidang pilihan di dalam situs yang saya ketahui, tetapi pelanggan tetap harus disimpan di dalam basis data saya! Sama berlaku untuk pengguna aktif (request.user), masing-masing id (request.user.id). Bisakah data ini diteruskan ke modelForm juga?

Apakah orang lain juga memiliki masalah ini dan mungkin tahu solusinya? Apa yang harus saya ubah di dalam modelForm saya untuk membuatnya berfungsi?

Terima kasih atas semua upaya Anda dan akhir pekan yang bahagia untuk Anda semua!

1
finethen 17 April 2020, 19:47

1 menjawab

Jawaban Terbaik

Anda tidak harus. Anda cukup mengecualikan bidang customer dari bidang:

class EntryForm(ModelForm):
    class Meta:
        model = Entry
        exclude = ['customer']

    def __init__(self, *args, pk, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['project'].queryset = Project.objects.filter(customer_id=pk)

Kemudian dalam tampilan di mana Anda menggunakan EntryForm, Anda dapat mengimplementasikan ini sebagai:

def my_view(request, customer_id):
    if request.method == 'POST':
        form = EntryForm(request.POST, request.FILES, pk=customer_id)
        if form.is_valid():
            form.instance.customer_id = customer_id
            form.save()
            return redirect('name-of-some-view')
    else:
        form = EntryForm(pk=customer_id)
    return render(request, 'name_of_template.html', {'form': form})

Dengan demikian, Anda dapat "menyuntikkan" data, dengan menyetelnya di form.instance.

1
Willem Van Onsem 17 April 2020, 16:58