我正在尝试以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上
非常感谢您对我的帮助!
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
@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})
{% 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 %}