Djang表单呈现列表

2024-05-19 17:07:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在Django创建一个基本的人格测试,作为工作中概念的证明。我对Django(以及一般的python)是新手,是在C#.NET背景下学习的。你知道吗

我试图建立一个表单对象列表(用从数据库中存储的问题对象中提取的信息填充),然后在HTML中显示它们。你知道吗

这只是部分工作;我可以在for循环中单独呈现表单属性(例如,通过调用,问题.pk)但是没有任何东西是用标准的Django{{form}}标记呈现的,尝试提交表单列表会破坏整个过程。你知道吗

我很确定处理一个较大的html中填充的一堆表单对象是一个问题,但我不确定如何着手解决它。你知道吗

我对表单集做了一些研究,但是找不到任何方法用数据库中的信息预填充表单项。你知道吗

提前谢谢!你知道吗

DISCQuestionForm输入表单.py地址:

class DISCQuestionForm(forms.Form):
    # create new form object from database question object
    def __init__(
            self,
            pk,
            disc_query,
            dom_answer,
            infl_answer,
            stead_answer,
            con_answer,
            ):
        super().__init__()
        self.pk = pk
        self.disc_query = disc_query
        self.dom_answer = dom_answer
        self.infl_answer = infl_answer
        self.stead_answer = stead_answer
        self.con_answer = con_answer
        self.disc_response = forms.DecimalField(
            max_value=4,
            widget=forms.NumberInput
            )

光盘创建方法视图.py你知道吗

# Create a new DISC assessment for current user
def disc_create(request, pk):
    profile = User.objects.get(pk=pk)
    user = int(profile.pk)
    name = profile.name
    rawquestionset = DISCQuestion.objects.all()

    discformset = []
    for item in rawquestionset:
        question = DISCQuestionForm(
            pk=item.pk,
            disc_query=item.disc_query,
            dom_answer=item.dom_answer,
            infl_answer=item.infl_answer,
            stead_answer=item.stead_answer,
            con_answer=item.con_answer,
        )
        discformset.append(question)

    if request.method == 'POST':
        questionset = discformset[request.POST]
        if questionset.is_valid():
            dom = 0
            infl = 0
            stead = 0
            con = 0

            for discquestion in questionset:
                if discquestion.disc_response == discquestion.dom_answer:
                    dom += 1
                if discquestion.disc_response == discquestion.infl_answer:
                    infl += 1
                if discquestion.disc_response == discquestion.stead_answer:
                    stead += 1
                if discquestion.disc_response == discquestion.con_answer:
                    con += 1

            disctest = DISCTest(
                user=user,
                name=name,
                dom=dom,
                infl=infl,
                stead=stead,
                con=con,
            )
            disctest.save()
    else:
        questionset = discformset

    context = {
        "pk": user,
        "name": name,
        "discquestionset": questionset
    }

    return render(request, "disc_create.html", context)

disc测试与disc问题模型型号.py地址:

class DISCTest(models.Model):
    user = models.ForeignKey('User', on_delete=models.CASCADE)
    name = user.name
    created_on = models.DateTimeField(auto_now_add=True)
    dom = models.DecimalField(max_digits=3, decimal_places=0)
    infl = models.DecimalField(max_digits=3, decimal_places=0)
    stead = models.DecimalField(max_digits=3, decimal_places=0)
    con = models.DecimalField(max_digits=3, decimal_places=0)


class DISCQuestion(models.Model):
    disc_query = models.TextField()
    disc_response = models.DecimalField(max_digits=1, decimal_places=0, null=True)
    dom_answer = models.DecimalField(max_digits=1, decimal_places=0)
    infl_answer = models.DecimalField(max_digits=1, decimal_places=0)
    stead_answer = models.DecimalField(max_digits=1, decimal_places=0)
    con_answer = models.DecimalField(max_digits=1, decimal_places=0)

最后是光盘_创建.html在模板中:

{% extends "base.html" %}

{% block page_content %}
<div class="col-md-8 offset-md-2">
    <h1>Take your DISC assessment</h1>
    <hr>
    <h3>Insert instructions here</h3>
    <hr>
    <form action="/assessment/create/{{pk}}/" method="post">
        {% csrf_token %}
        <div>
            {% for question in discquestionset %}
                <p>{{question.pk}}</p>
                <p>{{ question.disc_query }}</p>
                {{ form }}
            {% endfor %}
        </div>
        <button type="submit">Submit</button>
    </form>
</div>
{% endblock %}

Tags: answerselfmodelsconmaxdomdecimaldisc
1条回答
网友
1楼 · 发布于 2024-05-19 17:07:51

您的DiscQuestionForm没有字段。disc_response被定义为表单的属性,但对于Django,它不是字段,因为它没有添加到self.fields。并且form没有在for循环的模板中定义,只有question(这是表单),所以{{ question }}会打印表单(如果它有任何字段)。你知道吗

但是问题是,每个question表单字段都具有相同的“name”属性,因为它们没有前缀以使其唯一。你知道吗

你应该仔细阅读this document来理解ModelFormmodelformset。基本上你需要:

class DISCQuestionForm(forms.ModelForm):
    class Meta:
        model = DISCQuestion

    def __init__(...):
        ...

使用modelformset_factory创建一个合适的ModelFormSet,提交时可以用request.POST初始化。你知道吗

DISCQuestionFormSet = modelformset_factory(DISCQuestionForm, form = DISCQuestionForm)  # note DISCQuestionForm not needed if you don't customise anything in your form.

在你看来:

formset = DISCQuestFormSet(request.POST or None)

然后在模板中,您可以循环浏览表单集中的表单:

{% for form in formset %}{{ form }}{% endfor %}

相关问题 更多 >