【问题标题】:Django - Using function in templateDjango - 在模板中使用函数
【发布时间】:2019-11-28 09:02:19
【问题描述】:

我试图弄清楚如何为我的用户创建一个进度跟踪器,以便他们可以看到他们填写了多少 % 的表单。

我不知道如何创建该函数,然后在模板中使用它/调用它。

Views - 计算进度功能

我班级中的函数目前看起来像这样(我故意在班级中排除了表格以避免混乱):

class OpdaterEvalView(ModelFormMixin, DetailView):
    template_name = 'evalsys/evalueringer/evaluering_forside.html'
    model = Evaluation
    form_class = OpdaterEvalForm

    def calculate_progress(self, evaluation=None):
        value = [evaluation.communication, evaluation.motivate_others,
                 evaluation.development, evaluation.cooperation]
        count = 0
        if value[0]:
            count += 1
        if value[1]:
            count += 1
        if value[2]:
            count += 1
        if value[3]:
            count += 1
        return count * 25

这个想法是,它将检查数据库中存在值的数组,如果存在 0、1、2、3 值,它将显示 25%、50%、75%、100%。我只是真的不知道如何让这个功能在我的模板中工作?我怎么称呼它?也许这个功能在课堂之外?但是我该如何针对评估的具体pk。

更新 - 更多信息

我有一个评估模型和一个称为关系的模型表单,其中我有四个值:

 value = [evaluation.eval_relations.communication, evaluation.eval_relations. motivate_others,
                     evaluation.eval_relations.development, evaluation.eval_relations.cooperation]

我有一个名为 eval_relations 的评估模型的外键。

【问题讨论】:

  • 看起来很有趣,也许你可以使用django自定义模板标签(docs.djangoproject.com/en/2.2/howto/custom-template-tags)或者AJAX
  • 如果你想在不刷新页面的情况下调用服务器,那么你必须做一些ajax。我将从查看 django-ajax 库开始。
  • 当用户填写表格时,您是否更改百分比或保存在数据库中的数据百分比?
  • 我不需要在不刷新页面的情况下更新它,因为当用户保存评估时页面会更新,然后返回到“评估概述”页面,他们将能够看到评估的概述和进展。我一直在查看模板标签..但我仍在努力弄清楚如何使该功能与模板一起使用。
  • @sandeep 保存评估时数据库中数据的百分比

标签: python django django-models django-templates django-views


【解决方案1】:

这是我的假设:

用户模型

具有 5 个字段(f1、f2、f3、f4、f5)和带有用户模型的 OneToOneField 的配置文件模型。

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='user_name')
    f1 = ...
    .
    .

表单中有 5 个字段。我们要显示数据库中保存了多少字段。

当用户第一次打开表单时(当配置文件模型中没有保存数据时),这将显示 0% 完成。

如果用户之前保存了 3 个字段,它将显示 60%。

我假设用户(正在填写表单)已登录。

views.py

def index(request):
    user = request.user
    if user.user_name is None:
        per = 0
    else:
        b = [user.user_name.f1, user.user_name.f2, user.user_name.f3, user.user_name.f4, user.user_name.f5]
        count = 0
        for j in b:
            if j:
                count += 1
        per = count * 20
    if request.method == 'POST':
        form = FormName(request.POST)
        if form.is_valid():
            form_save = form.save(commit=False)  # assuming you are using ModelForm.
            form_save.user = user  # user is OneToOneField
            form_save.save()
            # if you don't redirect after save, django will show same page after saving.
    else:
        form = FormName()
    context = {
        'form': form,
        'per': per
    }
    return render(request, 'templateName.html', context)

模板

<h1>{{ per }}% completed</h1>
<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form  }}
    <input type="submit" value="submit">
</form>

我用它来检查配置文件完成的百分比。如果您有不同的情况,请发表评论。

【讨论】:

  • 这似乎是正确的方向。是否正确理解您正在保存 modelForm (在此上下文中的配置文件),然后检查哪些值存在?我已经用更正确的条件更新了我的帖子。我不将用户用作 pk,而是使用我拥有的评估模型,它有一个名为 Relations 的 modelForm 的外键,正如您在配置文件模型中提到的那样,我正在检查数据库中的值。
猜你喜欢
  • 2017-12-05
  • 2011-01-08
  • 2011-08-17
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多