【问题标题】:Filtering in Django Model Form where the user inputs the filter values在用户输入过滤器值的 Django 模型表单中进行过滤
【发布时间】:2017-08-10 03:45:46
【问题描述】:

我对 django 很陌生,虽然我的热情我坚持以下:

我有模型

class Task(models.Model):
    Taskdetails = models.CharField(max_length=500, null=True)
    asset = models.ForeignKey('Asset', null=True)

    def __str__(self):
        return str(self.id)

我已经使用 ModelForm 技术创建了几个对象

我想创建一个模板,用户可以选择一个资产并通过按下按钮来显示与该资产相关的所有任务。我提到资产有很多任务。我正在尝试使用 Django ModelForm 来做到这一点。

所以,我首先创建了表单

class HistoryForm(ModelForm):

    class Meta:
        model = Task
        fields =('asset',)

然后我创建了“历史”视图,用户可以在其中选择感兴趣的资产:

def history(request):
    if request.method == "POST":
        hist_form = HistoryForm(request.POST)
        if hist_form.is_valid():
           hist = hist_form.save(commit=False)
           hist.save()
           return ('results')
    else:
       hist_form = HistoryForm()

    return render(request, 'TaskTrace/history.html', {'hist_form': hist_form}

html标签(部分)如下

{{ hist_form }}
<p><a href="{% url 'results'  %}"> <button type="submit" > Results</button></a></p>

然后我想采取用户做出的选择并将其转移到下一个视图('结果')

def results(request):
    tasks = Task.objects.filter(asset=request.POST.get('asset', None))
    return render(request, 'Tasktrace/results.html', {'tasks': tasks})

而hmtl模板是

{% for task in tasks %}
    <div>
        <p><a href=""><u>{{ task }}  </a></p>
    </div>
{% endfor %}

问题是我没有得到任何任务。我相信我的大问题是将价值从第一个视图转移到另一个视图。

这是在 ModelForms 中进行过滤的正确方法吗?我可能在这里错过了一些东西

非常感谢您的帮助

【问题讨论】:

    标签: django django-models django-forms django-queryset


    【解决方案1】:

    你们很亲密。

    history.html 里面写这样的表格:

    <form method="POST" action="{% url 'results' %}">{% csrf_token %}
        {{ hist_form }}
        <input type="submit" name="submit_results" value="Results" />
    </form>
    

    现在,上面的表单将提交到results 视图,在那里您将获得任何POST 数据(就像您已经做的那样,request.POST.get('asset', None))。

    【讨论】:

    • 救生员 :) 谢谢!效果很好!
    • 我面临的另一个问题是,当我不选择任何资产时,结果页面不显示但出现错误:ValueError at /results/ invalid literal for int() with base 10: ' ' 我的想法是当用户不选择任何资产时,所有任务都会出现在结果页面中。有什么办法可以解决吗?
    • 能否请您显示此错误发生在哪一行?它显示在回溯中。
    • 我认为可以使用if not 解决问题。我的意思是if not request.POST.get('asset', None) 然后do something。它似乎工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 2011-10-25
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多