Django表单CharField未设置初始值

时间:2020-05-30 18:38:00

标签: django python-3.x forms heroku django-forms

我正在尝试以Django形式设置初始值,该视图在视图中会多次显示。

不幸的是,即使经过3个小时的搜索和调试,它最终还是像我尝试过的所有方法都无法正常工作一样。

我的表单用于创建链接到对话的消息对象(我正在构建一个聊天机器人应用程序),并且在我的对话模板中,我以表单形式显示每条消息以使其以后可编辑。

问题是表单的每个字段都设置了我传递给view.py中的message_values var内部的表单的默认值。例外一个:“ tag_list” CharField(请参见下文)

我不能使用ModelForm,因为一条消息由多个模型组成(q_reply_ *字段将在我的视图中创建QuickReplies()对象,标签将创建多个Tag()等)

我尝试过在创建表单时在视图中传递指定 initial = message_values 的数据,并通过 __ init __ 通过以kwargs获取值来设置值(就像我所做的那样)用于消息var),但它只是不想工作...

我在任何地方都没有收到任何错误,零警告,并且在调试时得到的确认是,我获取标签的ManyToMany充满了数据,因此我在 message_values ['tag_list']中传递了字符串不是空的,应该显示在我的模板中。

如果有帮助,我的项目将托管在Heroku上

非常感谢您对我的帮助!

forms.py

class MessageForm(forms.Form):
    text                = forms.CharField(max_length=512, required=False, widget=forms.TextInput(attrs={'placeholder' : 'Text message'}))
    file                = forms.FileField(required=False)

    file_type           = forms.ChoiceField(choices=TYPE_CHOICES,required=False)

    tag_list            = forms.CharField(max_length=2048, required=False, widget=forms.TextInput(attrs={'placeholder' : 'Message tags (comma separated values)'}))

    q_reply_title_1     = forms.CharField(max_length=512, required=False, widget=forms.TextInput(attrs={'placeholder' : 'Button title'}))
    q_reply_redirect_1  = forms.ModelChoiceField(queryset=Message.objects.all(), required=False, empty_label='Next message')
    q_reply_title_2     = forms.CharField(max_length=512, required=False, widget=forms.TextInput(attrs={'placeholder' : 'Button title'}))
    q_reply_redirect_2  = forms.ModelChoiceField(queryset=Message.objects.all(), required=False, empty_label='Next message')
    q_reply_title_3     = forms.CharField(max_length=512, required=False, widget=forms.TextInput(attrs={'placeholder' : 'Button title'}))
    q_reply_redirect_3  = forms.ModelChoiceField(queryset=Message.objects.all(), required=False, empty_label='Next message')
    q_reply_title_4     = forms.CharField(max_length=512, required=False, widget=forms.TextInput(attrs={'placeholder' : 'Button title'}))
    q_reply_redirect_4  = forms.ModelChoiceField(queryset=Message.objects.all(), required=False, empty_label='Next message')
    q_reply_title_5     = forms.CharField(max_length=512, required=False, widget=forms.TextInput(attrs={'placeholder' : 'Button title'}))
    q_reply_redirect_5  = forms.ModelChoiceField(queryset=Message.objects.all(), required=False, empty_label='Next message')
    q_reply_title_6     = forms.CharField(max_length=512, required=False, widget=forms.TextInput(attrs={'placeholder' : 'Button title'}))
    q_reply_redirect_6  = forms.ModelChoiceField(queryset=Message.objects.all(), required=False, empty_label='Next message')
    q_reply_title_7     = forms.CharField(max_length=512, required=False, widget=forms.TextInput(attrs={'placeholder' : 'Button title'}))
    q_reply_redirect_7  = forms.ModelChoiceField(queryset=Message.objects.all(), required=False, empty_label='Next message')


    next_message        = forms.ModelChoiceField(queryset=Message.objects.all(), required=False, empty_label='Default next message')


    def __init__(self, *args, **kwargs):

        messages = kwargs.get('messages', None)

        del kwargs['messages']

        super(MessageForm, self).__init__(*args, **kwargs)

        self.fields['q_reply_redirect_1'].queryset  = messages
        self.fields['q_reply_redirect_2'].queryset  = messages
        self.fields['q_reply_redirect_3'].queryset  = messages
        self.fields['q_reply_redirect_4'].queryset  = messages
        self.fields['q_reply_redirect_5'].queryset  = messages
        self.fields['q_reply_redirect_6'].queryset  = messages
        self.fields['q_reply_redirect_7'].queryset  = messages

        self.helper = FormHelper()
        self.helper.form_show_labels = False

views.py

@login_required
def edit_conversation(request, conversation_slug):

    selected_account = get_selected_account(request)

    if not selected_account:
        return redirect('chose-user-account')


    account_conversations = selected_account.conversations.all()

    conversation = get_object_or_404(account_conversations, slug=conversation_slug)

    message_form = MessageForm(request.POST or None, messages = conversation.flow.all().order_by('id'))

    #Pre fill forms with conversation flow data

    complete_flow = conversation.flow.all().order_by('id')

    block_id = 0

    for message in complete_flow :



        block_id += 1
        message_values = dict()
        message_values['text']          = message.text
        message_values['next_message']  = message.next

        message_values['tag_list'] = ''

        for tag in message.tags.all():
            message_values['tag_list'] = message_values['tag_list'] + str(tag.title) + ','


        if message.attachment :
            message_values['file']      = message.attachment.payload
            message_values['file_type'] = message.attachment.type

        i = 1
        for quick_reply in list(message.quick_replies.all()):
            message_values['q_reply_title_'+str(i)]             = quick_reply.title
            if quick_reply.payload:
                try:
                    message_values['q_reply_redirect_'+str(i)]  = complete_flow.get(slug=quick_reply.payload)
                except :
                    print('Message not found with payload '+str(quick_reply.payload))
            i += 1




        message.order_id    = block_id
        print (message_values)
        message.form        = MessageForm(message_values, messages = conversation.flow.all().order_by('id'))

    return render(request, 'edit_conversation.html', {'conversation' : conversation, 'message_form' : message_form, 'complete_flow' : complete_flow, 'conversation_slug' : conversation_slug})

edit_conversation.html

{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block title %} Edit conversation {% endblock %}
{% block page_title %} {{ conversation.title }} {% endblock %}
{% block content %}

<style>
  form {
    padding: 10px;
    border: 1px solid #034997;
    width: 600px;
    border-radius: 10px;
    background-color: #f0f0f0;
    margin: 10px;
    display: flex;
    flex-direction: column;
  }
</style>

<div class="d-flex  flex-wrap">

  <form action="{% url 'create-message' conversation_slug %}" method="post" enctype="multipart/form-data">
    <h2>New block</h2>
    {% csrf_token %}
    {{ message_form.text|as_crispy_field }}
    {{ message_form.file|as_crispy_field }}
    {{ message_form.file_type|as_crispy_field }}
    {{ message_form.next_message|as_crispy_field}}
    {{ message_form.tag_list|as_crispy_field}}

    <div class="row">
      <div class="col-6">
        {{ message_form.q_reply_title_1|as_crispy_field}}
      </div>
      <div class="col-6">
        {{ message_form.q_reply_redirect_1|as_crispy_field}}
      </div>
    </div>

    <div class="row">
      <div class="col-6">
        {{ message_form.q_reply_title_2|as_crispy_field}}
      </div>
      <div class="col-6">
        {{ message_form.q_reply_redirect_2|as_crispy_field}}
      </div>
    </div>

    <div class="row">
      <div class="col-6">
        {{ message_form.q_reply_title_3|as_crispy_field}}
      </div>
      <div class="col-6">
        {{ message_form.q_reply_redirect_3|as_crispy_field}}
      </div>
    </div>

    <div class="row">
      <div class="col-6">
        {{ message_form.q_reply_title_4|as_crispy_field}}
      </div>
      <div class="col-6">
        {{ message_form.q_reply_redirect_4|as_crispy_field}}
      </div>
    </div>

    <div class="row">
      <div class="col-6">
        {{ message_form.q_reply_title_5|as_crispy_field}}
      </div>
      <div class="col-6">
        {{ message_form.q_reply_redirect_5|as_crispy_field}}
      </div>
    </div>

    <div class="row">
      <div class="col-6">
        {{ message_form.q_reply_title_6|as_crispy_field}}
      </div>
      <div class="col-6">
        {{ message_form.q_reply_redirect_6|as_crispy_field}}
      </div>
    </div>

    <div class="row">
      <div class="col-6">
        {{ message_form.q_reply_title_7|as_crispy_field}}
      </div>
      <div class="col-6">
        {{ message_form.q_reply_redirect_7|as_crispy_field}}
      </div>
    </div>
    <input type="submit">
  </form>

{% for message in complete_flow %}
  <form action="{% url 'update-message' conversation_slug message.slug %}" method="post" enctype="multipart/form-data">
    <h2>Message #{{message.order_id}}</h2>
    {% csrf_token %}
    {{ message.form.text|as_crispy_field }}
    {{ message.form.file|as_crispy_field }}
    {{ message.form.file_type|as_crispy_field }}
    {{ message.form.next_message|as_crispy_field}}
    {{ message_form.tag_list|as_crispy_field}}

    <div class="row">
      <div class="col-6">
        {{ message.form.q_reply_title_1|as_crispy_field}}
      </div>
      <div class="col-6">
        {{ message.form.q_reply_redirect_1|as_crispy_field}}
      </div>
    </div>

    <div class="row">
      <div class="col-6">
        {{ message.form.q_reply_title_2|as_crispy_field}}
      </div>
      <div class="col-6">
        {{ message.form.q_reply_redirect_2|as_crispy_field}}
      </div>
    </div>

    <div class="row">
      <div class="col-6">
        {{ message.form.q_reply_title_3|as_crispy_field}}
      </div>
      <div class="col-6">
        {{ message.form.q_reply_redirect_3|as_crispy_field}}
      </div>
    </div>

    <div class="row">
      <div class="col-6">
        {{ message.form.q_reply_title_4|as_crispy_field}}
      </div>
      <div class="col-6">
        {{ message.form.q_reply_redirect_4|as_crispy_field}}
      </div>
    </div>

    <div class="row">
      <div class="col-6">
        {{ message.form.q_reply_title_5|as_crispy_field}}
      </div>
      <div class="col-6">
        {{ message.form.q_reply_redirect_5|as_crispy_field}}
      </div>
    </div>

    <div class="row">
      <div class="col-6">
        {{ message.form.q_reply_title_6|as_crispy_field}}
      </div>
      <div class="col-6">
        {{ message.form.q_reply_redirect_6|as_crispy_field}}
      </div>
    </div>

    <div class="row">
      <div class="col-6">
        {{ message.form.q_reply_title_7|as_crispy_field}}
      </div>
      <div class="col-6">
        {{ message.form.q_reply_redirect_7|as_crispy_field}}
      </div>
    </div>
    <input type="submit">
  </form>
{% endfor %}

</div>
{% endblock %}

0 个答案:

没有答案