Looking for django Keywords? Try Ask4Keywords

Django Suppression du champ modelForm en fonction de la condition de views.py


Exemple

Si nous avons un modèle comme suit,

from django.db import models
from django.contrib.auth.models import User

class UserModuleProfile(models.Model):
    user = models.OneToOneField(User)
    expired = models.DateTimeField()
    admin = models.BooleanField(default=False)
    employee_id = models.CharField(max_length=50)
    organisation_name = models.ForeignKey('Organizations', on_delete=models.PROTECT)
    country = models.CharField(max_length=100)
    position = models.CharField(max_length=100)

    def __str__(self):
        return self.user

Et une forme de modèle qui utilise ce modèle comme suit,

from .models import UserModuleProfile, from django.contrib.auth.models import User
from django import forms

class UserProfileForm(forms.ModelForm):
    admin = forms.BooleanField(label="Make this User Admin",widget=forms.CheckboxInput(),required=False)
    employee_id = forms.CharField(label="Employee Id ")
    organisation_name = forms.ModelChoiceField(label='Organisation Name',required=True,queryset=Organizations.objects.all(),empty_label="Select an Organization")
    country = forms.CharField(label="Country")
    position = forms.CharField(label="Position")

    class Meta:
        model = UserModuleProfile
        fields = ('admin','employee_id','organisation_name','country','position',)

    def __init__(self, *args, **kwargs):
        admin_check = kwargs.pop('admin_check', False)
        super(UserProfileForm, self).__init__(*args, **kwargs)
        if not admin_check:
            del self.fields['admin']

Notez que sous la classe Meta dans le formulaire, j'ai ajouté une fonction d' initialisation que nous pouvons utiliser lors de l'initialisation du formulaire depuis views.py pour supprimer un champ de formulaire (ou d'autres actions). Je vais expliquer cela plus tard.

Donc, ce formulaire peut être utilisé à des fins d'inscription des utilisateurs et nous voulons tous les champs définis dans la classe Meta du formulaire. Mais que se passe-t-il si nous voulons utiliser le même formulaire lorsque nous modifions l'utilisateur, mais lorsque nous le faisons, nous ne voulons pas afficher le champ admin du formulaire?

Nous pouvons simplement envoyer un argument supplémentaire lorsque nous initialisons le formulaire en fonction d’une logique et supprimons le champ admin du backend.

def edit_profile(request,user_id):
    context = RequestContext(request)
    user = get_object_or_404(User, id=user_id)
    profile = get_object_or_404(UserModuleProfile, user_id=user_id)
    admin_check = False
    if request.user.is_superuser:
        admin_check = True
    # If it's a HTTP POST, we're interested in processing form data.
    if request.method == 'POST':
        # Attempt to grab information from the raw form information.
        profile_form = UserProfileForm(data=request.POST,instance=profile,admin_check=admin_check)
        # If the form is valid...
        if profile_form.is_valid():
            form_bool = request.POST.get("admin", "xxx")
            if form_bool == "xxx":
                form_bool_value = False
            else:
                form_bool_value = True
            profile = profile_form.save(commit=False)
            profile.user = user
            profile.admin = form_bool_value
            profile.save()
            edited = True
        else:
            print profile_form.errors

    # Not a HTTP POST, so we render our form using ModelForm instance.
    # These forms will be blank, ready for user input.
    else:
        profile_form = UserProfileForm(instance = profile,admin_check=admin_check)

    return render_to_response(
            'usermodule/edit_user.html',
            {'id':user_id, 'profile_form': profile_form, 'edited': edited, 'user':user},
            context)

Comme vous pouvez le voir, j'ai montré ici un exemple d'édition simple utilisant le formulaire que nous avons créé précédemment. Notez que lorsque j'ai initialisé le formulaire, j'ai transmis une variable admin_check supplémentaire contenant True ou False .

profile_form = UserProfileForm(instance = profile,admin_check=admin_check)

Maintenant, si vous remarquez le formulaire que nous avons écrit plus tôt, vous pouvez voir que dans l' init, nous essayons d'attraper le admin_check que nous passons ici. Si la valeur est False, il suffit de supprimer le champ admin du formulaire et de l'utiliser. Et comme il s'agit d'un modèle, le champ admin ne peut pas être nul dans le modèle. Nous vérifions simplement si le post d'administration contenait un champ admin dans le post du formulaire, sinon nous avons défini False dans le code de la vue.

form_bool = request.POST.get("admin", "xxx")
if form_bool == "xxx":
    form_bool_value = False
else:
    form_bool_value = True