在视图中填充表单域

时间:2018-01-14 18:29:19

标签: python django

我正在开发一个有两个视图的图像板应用程序。 索引视图主题视图

Views.py

def ThreadView(request, thread_id):
template = loader.get_template('thread.html')
form = MessageForm(request.POST)
if request.method == 'POST':
    #form = MessageForm(initial={'thread': thread_id})
    #form.fields['thread'].initial = thread_id
    if form.is_valid():
        form.save()
        form = MessageForm()

    else:
        form = MessageForm()        

context = {
    'message': Thread.objects.get(id=thread_id),
    'replies': Message.objects.all().filter(thread=thread_id),
    'form':form
}
return HttpResponse(template.render(context, request))

Models.py

class Thread(models.Model):
    msg = models.TextField(max_length=9001)
    timestamp = models.DateTimeField(auto_now_add=True)

class Message(models.Model):
    msg = models.TextField(max_length=9001)
    timestamp = models.DateTimeField(auto_now_add=True)
    thread = models.ForeignKey('Thread', on_delete=models.CASCADE)

Forms.py

class ThreadForm(forms.ModelForm):
class Meta:
    model = Thread
    fields = [
        'msg'
    ]

class MessageForm(forms.ModelForm):
    class Meta:
        model = Message
        fields = [
            'msg'
        ]

问题是:消息模型有一个Thread模型的外键,当我发布到某个线程时,我需要在视图中使用thread_id预先填充消息模型中的"线程" -field .py(因为消息必须属于某个线程)。 我注释掉的两行是我尝试将字段值传递给表单,都不成功。

这在基于功能的视图中是否可行? (Python 3,Django 2.0)

对不起,如果我错过了什么,我真的厌倦了整天的编码。如果我没有发布一些重要信息,请随时问我。

1 个答案:

答案 0 :(得分:0)

我得到了它的工作。谢谢你的回复!

Views.py:

def ThreadView(request, thread_id):
template = loader.get_template('thread.html')
#form = MessageForm(request.POST or None, initial={'thread': thread_id})
if request.method == 'POST':
    form = MessageForm(request.POST or None, initial={'thread': thread_id})
    if form.is_valid():
        instance = form.save(commit=False)
        instance.thread_id=thread_id
        instance.save()
        return redirect(ThreadView, thread_id)

else:
    form = MessageForm(request.POST or None, initial={'thread': thread_id})        

context = {
    'message': Thread.objects.get(id=thread_id),
    'replies': Message.objects.all().filter(thread=thread_id),
    'thread_id': thread_id,
    'form':form
}
return HttpResponse(template.render(context, request))