Форма Django не печатает без ошибок и недействительна - PullRequest
0 голосов
/ 11 июня 2018

Чтобы создать форму на моем сайте, я создал несколько моделей, соответствующих моим полям.Затем я создал из них ModelForms, несколько видов и шаблонов.Моя проблема в том, что я никогда не вижу ошибок в формах, во-первых, в этом конкретном поле его форма всегда недействительна, даже с одним атрибутом.Можете ли вы объяснить мне, что я делаю не так?

models.py

class Grapheme(models.Model):
    lexeme = models.ForeignKey(Lexeme, on_delete=models.CASCADE)

    value = models.CharField(max_length=256)

    class Meta:
        verbose_name = "grapheme"
        ordering = ["value"]

    def __str__(self):
        return self.value

forms.py

class GraphemeForm(forms.ModelForm):
    class Meta:
        model = Grapheme
        fields = ['value']

views.py

@login_required
def lexeme_edit_view(request, lexicon_id):
    [...]

    if request.method == 'POST':
        lexeme_form = LexemeForm(request.POST)
        grapheme_form = GraphemeForm(request.POST)
        [...]

        if grapheme_form.is_valid(): # This line fails
        [...]

template.html

{% if grapheme_form.non_field_errors %}
    <div class="alert alert-danger" role="alert">
        {% for error in grapheme_form.non_field_errors %}
            {{ error }}
        {% endfor %}
    </div>
{% endif %}

[...]

<div class="form-group row">
    <label for="graphemeInput" class="control-label col-lg-2">{{ grapheme_form.value.label }}</label>
    <div class="col-lg-6">
        {% if grapheme_form.is_bound %}
            {% if grapheme_form.value.errors %}
                {% for error in grapheme_form.value.errors %}
                    <div class="invalid-feedback">
                        {{ error }}
                    </div>
                {% endfor %}
            {% endif %}

            {% if grapheme_form.value.help_text %}
                <small class="form-text text-muted">{{ grapheme_form.value.help_text }}</small>
            {% endif %}
        {% endif %}

        {% render_field grapheme_form.value type="text" class+="form-control" id="graphemeInput" %}
    </div>
</div>

1 Ответ

0 голосов
/ 11 июня 2018

Проблема в том, что у вас есть внешний лексемный ключ в вашей графической модели.

Поскольку вы используете django Modelforms, если вы не установите blank=True, null=True в отношение внешнего ключа, оно автоматически становится обязательным полем.

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

fields = ['value']

, поэтому вы получаете обязательное полеотсутствует ошибка в вашей форме.

У вас есть два возможных решения:
Решение 1
add blank = True, null = True для отношений с внешним ключом:

lexeme = models.ForeignKey(Lexeme, blank=True,null=True on_delete=models.CASCADE)


Решение 2: установить значение лексемы при инициализации формы:

class GraphemeForm(Form):
def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    lexeme = Lexeme.objects.get(id=1)
    self.fields['lexeme'].initial = lexeme

class Meta:
    model = Grapheme
    fields = ['value']
...