Je suis en train de mettre en place une application simple de «classe» où l'enseignant serait capable de mettre à jour les notes sans changer le nom des étudiants (du moins pas sur la mise à jour page de grade). Pour ce faire, j'utilise l'un des trucs en lecture seule, le plus simple. Le problème est qu'après le SOUMETTRE la vue est ré-affichée avec des valeurs «vides» pour les étudiants. J'aimerais que les noms des étudiants réapparaissent.Valeurs CharField disparaissant après la sauvegarde (champ en lecture seule)
Voici l'exemple le plus simple qui présente ce problème. (C'est une mauvaise conception de DB, je sais, j'ai extrait juste les parties pertinentes du code pour mettre en évidence le problème.Dans l'exemple réel, étudiant est dans sa propre table, mais le problème existe toujours là.)
models.py
class Grade1(models.Model):
student = models.CharField(max_length=50, unique=True)
finalGrade = models.CharField(max_length=3)
class Grade1OForm(ModelForm):
student = forms.CharField(max_length=50, required=False)
def __init__(self, *args, **kwargs):
super(Grade1OForm,self).__init__(*args, **kwargs)
instance = getattr(self, 'instance', None)
if instance and instance.id:
self.fields['student'].widget.attrs['readonly'] = True
self.fields['student'].widget.attrs['disabled'] = 'disabled'
def clean_student(self):
instance = getattr(self,'instance',None)
if instance:
return instance.student
else:
return self.cleaned_data.get('student',None)
class Meta:
model=Grade1
views.py
from django.forms.models import modelformset_factory
def modifyAllGrades1(request):
gradeFormSetFactory = modelformset_factory(Grade1, form=Grade1OForm, extra=0)
studentQueryset = Grade1.objects.all()
if request.method=='POST':
myGradeFormSet = gradeFormSetFactory(request.POST, queryset=studentQueryset)
if myGradeFormSet.is_valid():
myGradeFormSet.save()
info = "successfully modified"
else:
myGradeFormSet = gradeFormSetFactory(queryset=studentQueryset)
return render_to_response('grades/modifyAllGrades.html',locals())
modèle
<p>{{ info }}</p>
<form method="POST" action="">
<table>
{{ myGradeFormSet.management_form }}
{% for myform in myGradeFormSet.forms %}
{# myform.as_table #}
<tr>
{% for field in myform %}
<td> {{ field }} {{ field.errors }} </td>
{% endfor %}
</tr>
{% endfor %}
</table>
<input type="submit" value="Submit">
</form>
Merci Lakshman, mais je suis encore nouveau à Django. Comment puis-je définir la valeur d'origine? J'essaie de l'appeler comme: student = forms.CharField (max_length = 50, widget = ReadOnlyWidget()) mais ce n'est pas correct car j'ai besoin de passer une valeur originale. Note ... Mon but éventuel est de l'utiliser dans un modelformset. – jamida
jamida: Passez à ReadOnlyWidget, une instance d'étudiant, que vous souhaitez afficher en lecture seule sur le formulaire. –
Comment faire cela dans un modelformset? Est-ce que je fais cela dans l'exemple de code ci-dessus ou dans la routine __init__ du formulaire? (ou soit?) Et si la routine init, comment faire référence au widget dans cette routine init? Je suis ouvert à la lecture de documentation, mais cette profondeur dans django n'est pas bien documentée. Si vous avez un lien, ce serait génial! – jamida