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

Is it possible to create Form in django that lets you change or add directly in the database?

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

所以我有一个模板,如果在给字段或答案的基础中有一个值,那么我可以显示该值,然后显示一个空白字段作为答案。

我的表单集模板:

<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>

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

My 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/')

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

My 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)

当数据库中已有值时,如何更改值而不是再次添加?

Edit : screenshot of the problem This saves 2 other lines more when I submit ..

尽管您可以使用当前的方法编辑当前的回复,方法是在您的回复表单中添加一个隐藏的 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 %}

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

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

如果您在没有实例的情况下调用 form,Django 表单将在数据库中创建一个新条目。

form = MyForm()

相反,如果您想更新数据库中的现有条目,请将 instance 传递给 form

form = MyForm(instance=myinstance)