是否可以在django中创建允许您直接在数据库中更改或添加的表单?

Jér*_*dre 2 python forms django django-forms formset

是否可以创建一个表单,修改何时在数据库中找到信息,或者如果数据库中没有任何内容,则添加信息?

所以我有一个模板,允许我显示值,如果在字段中有一个给出字段或答案然后显示答案的空白字段.

我的formset模板:

<form method="POST" action="">
    {{ formset.management_form }} {% csrf_token %}
    <table>

      <!-- <br>{{ formset.as_table }}<br> -->

      {% for question in questions %}<hr>

    <label for="question">{{ question }} [{{ question.id }}]</label>  
    <input type="hidden" id="id_form-{{ forloop.counter0 }}-question" name="form-{{ forloop.counter0 }}-question" value="{{ question.id }}"/>
 </p>
{% if question.reply_set.all %}
  {% for reply in question.reply_set.all %}
    <p>
    <label for="answer">Réponse :</label>
    <input type="text" id="id_form-{{ forloop.parentloop.counter0 }}-answer" name="form-{{ forloop.parentloop.counter0 }}-answer" value="{{ reply.answer }}"/>
    </p>
  {% endfor %}  
{% else %}
    <p>
    <label for="answer">Réponse :</label>
    <input type="text" id="id_form-{{ forloop.counter0 }}-answer" name="form-{{ forloop.counter0 }}-answer" placeholder="answer here"/>
    </p>
{% endif %}
{% endfor %}
       <br><br><br><hr> <br><br><br>
    </table><br>
    <center><input type="submit" value="Submit" class="btn btn-success" />
    <a href="../../baseVisite/" class="btn btn-success">Retour</a></center>
  </form>
Run Code Online (Sandbox Code Playgroud)

我的问题是,当数据库中没有任何内容时,我得到一个很好的添加,但是当我有数据时,如果我改变它的值,这就创建了另一个答案,因为我希望用新的替换答案!

我的views.py

def access(request, instance):
    questions = Question.objects.filter(page=instance)
    pages = Page.objects.all()
    numPages = Page.objects.get(pk=instance)
    length_questions = len(questions)
    logged_user = get_logged_user_from_request(request)
    instance = {'instance':instance}
    ReplyFormSet = modelformset_factory(model=Reply, form=ReplyForm, extra=length_questions)
    ReplyFormSet.form = staticmethod(curry(ReplyForm, instance=numPages))
    if logged_user:
        if request.method == 'POST':  
            formset = ReplyFormSet(request.POST, request.FILES)
            if formset.is_valid():
                new_instances = formset.save(commit=False)
                for new_instance in new_instances:
                    new_instance.user = logged_user
                    new_instance.save()
                return render_to_response('polls/access.html', {
         'formset': formset,
         'questions':questions,
         'logged_user':logged_user,
         'numPages' : numPages
         })
            else:
                messages.add_message(request, messages.INFO, "L'ajout à bien été effectué !")
                return render_to_response('polls/access.html', {
         'formset': formset,
         'questions':questions,
         'logged_user':logged_user,
         'numPages' : numPages
         })
        else:
            formset = ReplyFormSet(queryset = Reply.objects.none())
        return render_to_response('polls/access.html', {
         'formset': formset,
         'questions':questions,
         'logged_user':logged_user,
         'numPages' : numPages
         })
    else:
        return HttpResponseRedirect('/login/')
Run Code Online (Sandbox Code Playgroud)

我的模型允许我同时回答几个问题.

我的models.py

class Page(models.Model):
    title = models.CharField(max_length=30)


    def __str__(self):
        return self.title

class Question(models.Model):
    label = models.CharField(max_length=30)
    page = models.ManyToManyField(Page)

    def __str__(self):
            return self.label

class Reply(models.Model):
    question = models.ForeignKey(Question)
    user = models.ForeignKey(Personne)
    answer = models.CharField(max_length=30)
    creationDate = models.DateTimeField(default=django.utils.timezone.now)

    def __str__(self):
        return str(self.answer)
Run Code Online (Sandbox Code Playgroud)

如果已存在于数据库中,如何更改值而不是再次添加?

编辑:问题的屏幕截图当我提交时,这会更多地保存2个其他行...

在此输入图像描述

Muh*_*hir 5

虽然您可以通过id在回复表单中添加隐藏字段来使用当前方法编辑当前回复

{% for reply in question.reply_set.all %}
    <p>
    <label for="answer">Réponse :</label>
    <input type="text" id="id_form-{{ forloop.parentloop.counter0 }}-answer" name="form-{{ forloop.parentloop.counter0 }}-answer" value="{{ reply.answer }}"/>
    <input type="hidden" id="id_form-{{ forloop.parentloop.counter0 }}-id" name="form-{{ forloop.parentloop.counter0 }}-id" value="{{ reply.id }}"/>
    </p>
  {% endfor %}
Run Code Online (Sandbox Code Playgroud)

这将告诉您ReplyFormset这些记录已经存在,因此编辑现有记录而不是创建新记录.

然而,您手动完成的大部分工作都可以使用Django的内置功能完成,即Django Formsets(您正在使用但未正确使用).Django Inline Formsets是Django的做法.