Django UpdateView创建一个新对象,而不是更新当前对象

Django UpdateView创建一个新对象,而不是更新当前对象,django,django-forms,django-class-based-views,Django,Django Forms,Django Class Based Views,每次我使用UpdateView并尝试更改某些属性时,它都会使用新的唯一主键在数据库中创建一个新对象。我的模型如下 class Delivery(models.Model): created_date = models.DateTimeField('date created', editable=False) modified_date = models.DateTimeField('modified', editable=False) user_name = models

每次我使用UpdateView并尝试更改某些属性时,它都会使用新的唯一主键在数据库中创建一个新对象。我的模型如下

class Delivery(models.Model):
    created_date = models.DateTimeField('date created', editable=False)
    modified_date = models.DateTimeField('modified', editable=False)
    user_name = models.ForeignKey(User, null=False)
    stream_name = models.CharField(max_length=50, null=False)
    view_name = models.CharField(max_length=100, null=False, blank=True)
    activity_name = models.CharField(max_length=100, null=False, blank=True)
    jira = models.URLField()
    codereview = models.URLField()
    related_streams = models.CharField(max_length = 100, choices=sorted(streams()))
    description = models.TextField(null=False,blank=True)
    status = models.BooleanField(default=False, blank=False)

    class Meta:
        verbose_name = "Delivery"
        verbose_name_plural = "Deliveries"
        unique_together = (("user_name", "view_name", "activity_name"),)
对于表单,我使用的是ModelFactoryForm,UpdateView默认情况下使用该ModelFactoryForm使用模型本身来选择form_类

class UpdateEntryView(UpdateView):
    template_name = 'tracker/update.html'
    model = Delivery
    success_url = reverse_lazy('table_view')
    status = StreamStatus()
    fields = ['stream_name','view_name','activity_name','jira','related_streams','description','status']

    def get_context_data(self, **kwargs):
        ctx = super(UpdateEntryView, self).get_context_data(**kwargs)
        ctx['locked'] = self.status.getLocked()
        ctx['unlocked'] = self.status.getUnlocked()
        return ctx
HTML模板如下所示:

...
{% block content %}
<form action="/tracker/entry/" method="post" class="form">
    {% csrf_token %}
    <div class="form-goup">
        <div class="panel panel-default">
            <div class="panel-heading">Enter the codereview link and let the machine do the work for you ...</div>
            <div class="panel-body">
                <div class="input-group">
                    <i class="glyphicon glyphicon-link input-group-addon" aria-hidden="true"></i>
                    <input type="text" class="form-control" name="codereview"  placeholder="Codereview link">
                </div>
            </div>
        </div>
        <hr>
        <div class="panel panel-default">
            <div class="panel-heading">Add an entry manually ...</div>
            <div class="panel-body">
                {% bootstrap_form form %}
            </div>
        </div>
        <hr>
        {% buttons %}
        <button type="submit" class="btn btn-primary btn-block">
        {% bootstrap_icon "lock" %} Submit
        </button>
        {% endbuttons %}
    </div>
</form>
{% endblock %}
...
。。。
{%block content%}
{%csrf_令牌%}
进入codereview链接,让机器为您完成工作。。。

手动添加一个条目。。。 {%bootstrap_form%}
{%buttons%} {%bootstrap_图标“lock”%}提交 {%endbuttons%} {%endblock%} ...

这是UpdateView中的一个缺陷,还是我自己把它搞砸了。

你的url可能指向CreateView而不是UpdateView吗?

你的url可能指向CreateView而不是UpdateView吗?

模板中的一行将把它发布到“/tracker/entry/”url,如果没有指定PK,我认为这就是导致您出现问题的原因

更新视图应该在URL中包含PK、id或slug,以便Django知道要更新的对象

删除url,它将发回与GET相同的位置

<form action="" method="post" class="form">

模板中的行将把它发布到“/tracker/entry/”url,但没有指定PK,我认为这就是造成问题的原因

更新视图应该在URL中包含PK、id或slug,以便Django知道要更新的对象

删除url,它将发回与GET相同的位置

<form action="" method="post" class="form">


非常感谢您。这就是问题所在!我头上的负担真重:)非常感谢。这就是问题所在!我头上卸下了这么大的负担:)谢谢,这似乎是问题所在谢谢,这似乎是问题所在我留下了一个链接,指向解决我案件的答案:我留下了一个链接,指向解决我案件的答案: