Pertanyaan Django: bagaimana cara mengakses pengguna permintaan saat ini di ModelForm?


Dalam implementasi ModelForm saya, saya ingin melakukan berbagai jenis pemeriksaan validasi berdasarkan apakah pengguna saat ini adalah superuser. Bagaimana saya dapat mengakses pengguna permintaan saat ini?


7
2017-09-04 14:49


asal


Jawaban:


Anda dapat meneruskan objek pengguna sebagai argumen tambahan dalam bentuk konstruktor.

misalnya

f = MyForm(user=request.user)

dan konstruktor akan terlihat seperti:

class MyForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
         self.user = kwargs.pop('user',None)
         super(MyForm, self).__init__(*args, **kwargs)

lalu gunakan pengguna dalam formulir clean_XX sesuai keinginan


12
2017-09-04 15:05



Catatan: jika Anda menggunakan Tampilan Berbasis Kelas (CBVs) kemudian meneruskan argumen tambahan dalam konstruktor formulir (mis. Di get_forms_class) atau di form_class tidak akan berfungsi, seperti <form> object is not callable akan ditampilkan.

Solusi untuk CBV adalah untuk digunakan get_form_kwargs, misalnya:

views.py:

# Sending user object to the form, to verify which fields to display/remove (depending on group)
def get_form_kwargs(self):
    kwargs = super(MyView, self).get_form_kwargs()
    kwargs.update({'user': self.request.user})
    return kwargs

forms.py:

class MyForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')  # To get request.user. Do not use kwargs.pop('user', None) due to potential security hole

        super(MyForm, self).__init__(*args, **kwargs)

        # If the user does not belong to a certain group, remove the field
        if not self.user.groups.filter(name__iexact='mygroup').exists():
            del self.fields['confidential']

11
2018-06-15 16:11