Значения CharField исчезают после сохранения (поле только для чтения) - PullRequest
0 голосов
/ 31 мая 2010

Я внедряю простое приложение «Зачетная книжка», в котором учитель сможет обновлять оценки без изменения имени учеников (по крайней мере, на странице обновления оценок). Для этого я использую один из трюков только для чтения, самый простой. Проблема в том, что после SUBMIT представление повторно отображается с «пустыми» значениями для студентов. Я бы хотел, чтобы имена учеников снова появились.

Ниже приведен простейший пример, демонстрирующий эту проблему. (Это плохой дизайн БД, я знаю, я извлек только соответствующие части кода, чтобы продемонстрировать проблему. В реальном примере student находится в своей собственной таблице, но проблема все еще существует там. )

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())

шаблон

<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>

Ответы [ 2 ]

1 голос
/ 31 мая 2010

Ваш способ отображения поля только для чтения - это проблема.

Поскольку поле студента отключено, отправка формы не будет содержать его в качестве входных данных, поэтому форма ошибки, отображаемая с сообщениями об ошибках проверки, не получает начальное значение.

Вот почему ReadOnly Widget должен быть более сложным, чем просто отключенное поле html.

Попробуйте использовать реальный ReadOnlyWidget, тот, который переопределяет _has_changed.

Вот что я использую. Для создания экземпляра он принимает original_value и, необязательно, display_value, если он отличается.

class ReadOnlyWidget(forms.Widget):

    def __init__(self, original_value, display_value=None):
        self.original_value = original_value
        if display_value:
            self.display_value = display_value
        super(ReadOnlyWidget, self).__init__()

    def _has_changed(self, initial, data):
        return False

    def render(self, name, value, attrs=None):
        if self.display_value is not None:
            return unicode(self.display_value)
        return unicode(self.original_value)

    def value_from_datadict(self, data, files, name):
        return self.original_value
0 голосов
/ 31 мая 2010

Я немного растягиваюсь здесь, поэтому некоторые мысли:

% Вы прослушали трафик, чтобы увидеть, что именно отправляется между браузером и сервером?

% Вам нужно отправить имя студента в виде скрытого поля (ваша база данных обновления может предполагать, что вы хотите, чтобы студент оставался пустым, если нет)?

% Вы просматривали исходный код HTML после его анализа Python?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...