2010-10-25 15 views
0

J'ai une forme de modèle et j'ai besoin que l'un des champs soit lu seulement jusqu'à ce qu'il soit sauvegardé. Je n'ai pas trouvé un bon moyen de le faire, et voici ce que j'ai dans mon admin.py.Dans Django, comment puis-je lire un champ uniquement la première fois qu'un formulaire est chargé?

class RequestForm(forms.ModelForm): 
    trac = forms.URLField(min_length=400, required=False) 
    impacted_users = forms.ModelMultipleChoiceField(queryset=Group.objects.all(), widget=forms.CheckboxSelectMultiple) 
    formfield_overrides = { 
    } 

    class Meta: 
     model = Request 

class RequestAdmin(admin.ModelAdmin): 
    form = RequestForm 
    list_display = ['id', 'title', 'priority', 'requestor', 'status'] 
    list_filter = ['requestor', 'priority', 'impacted_users'] 
    actions = [complete] 

    class Media: 
     js = (
      '/media/js/jquery.js', 
      '/media/js/hide.js', 
      ) 

    def save_model(self, request, obj, form, change): 
     instance = form.save(commit=False) 
     instance.requestor = request.user 
     instance.save() 
     form.save_m2m() 
     return instance 

Répondre

0

Ceci devrait être fait dans le contrôleur (appelé View in Django).

Dans la vue le traitement de votre formulaire, vérifiez pour une ligne comme ça:

if request.method == 'POST': 
    ... 
else: 
    ... 

Cela devrait ressembler à la vue de la official documentation. (Il devrait également être un test pour vérifier si form.is_valid() dans la première partie de cette if.)

La première partie de ce bloc logique est exécuté chaque fois qu'il est pas la première fois que l'utilisateur charge le formulaire (par exemple. Entrées non valides). La deuxième partie, le else, est ce qui se passe lorsque le formulaire est chargé pour la première fois.

Vous pouvez vérifier la manipulation du widget de formulaire dans la section correspondante de ce bloc logique. Référez-vous à this post pour définir un champ de saisie en lecture seule. Vous devriez être en mesure de modifier votre classe de formulaire à ce stade.

+0

Je n'ai pas encore implémenté de vues, j'espérais pouvoir le faire dans l'admin, car ce seront principalement les administrateurs qui le verront. On dirait qu'il est temps de laisser l'administrateur derrière :) – Ryan

1

Supposons que le champ en question est special_field.

Voilà comment vous le feriez (de this related answer):

class RequestForm(forms.ModelForm): 
    trac = forms.URLField(min_length=400, required=False) 
    impacted_users = forms.ModelMultipleChoiceField(queryset=Group.objects.all(), widget=forms.CheckboxSelectMultiple) 
    formfield_overrides = { 
    } 

    def __init__(self, special_field_starting_value=None, *args, **kwargs): 
     super(RequestForm,self).__init__(*args, **kwargs) 
     instance = getattr(self, 'instance', None) 
     if not (instance and instance.id): 
      self.fields['special_field'].widget.attrs['readonly'] = True 
      self.fields['special_field'].initial = special_field_starting_value 

    class Meta: 
     model = Request 

Cela fonctionne dans les deux admin et dans une vue normale. En fait, je ne l'ai pas testé, mais en supposant que la réponse à laquelle je suis lié est toujours valide, le code que j'ai écrit sur cette base devrait également être valide.