get_succes_url pk(id) 中的 Django CreateView object.id 是 NONE,然后在重定向到另一个 URL 后打印出创建的条目 ID

Django CreateView object.id in get_succes_url pk(id) is NONE and then after redirecting to another URL it prints out created entry ID

我有一个我无法弄清楚的问题。 创建工作订单后,我想重定向到该工作订单的详细信息页面。 这是我的 models.py

class Radni_nalozi(models.Model):
    Klijent = models.ForeignKey(Klijenti, on_delete=models.CASCADE)
    Pacijent = models.CharField(max_length=100)
    Rok_isporuke = models.DateField()
    Cijena = models.FloatField(default=0)
    Napomene = models.CharField(max_length=400,blank=True)
    Zaduzenja = models.CharField(max_length=400,blank=True)
    Status = models.CharField(max_length=50, choices=STATUS_CHOICES, default = "OTVOREN")
    Aktivan = models.BooleanField(default=True)

    def __str__(self):
       return f"{self.id} - {self.Klijent}, {self.Pacijent}"

这是我的模型表格:

class RadniModelForm(BSModalModelForm):
    class Meta:
        model = Radni_nalozi
        fields = ["Klijent","Pacijent","Rok_isporuke","Napomene","Zaduzenja"]
        labels = {"Klijent":"Klijent: ", "Pacijent":"Pacijent: ", "Rok_isporuke":"Rok isporuke: ", "Napomene":"Napomene: ","Zaduzenja":"Zaduženja: "}
        widgets = {'Rok_isporuke': DatePickerInput(options={
                        "locale":"en-gb",
                    })}

我想创建一个新的工作订单,我正在使用 django BSModalCreateView。 这是我的 views.py:

class RadniCreateView(LoginRequiredMixin,BSModalCreateView):
    template_name = 'app/radni_nalozi/dodaj_rn.html'
    form_class = RadniModelForm


    def get_form(self):
        form = super(RadniCreateView,self).get_form() #instantiate using parent
        form.fields['Klijent'].queryset = Klijenti.objects.filter(Aktivan=1)
        return form

    def get_context_data(self, **kwargs):
        context = super(BSModalCreateView, self).get_context_data(**kwargs)
        context['title'] = 'NOVI RADNI NALOG'
        context['gumb'] = 'KREIRAJ'
        return context

    def get_success_url(self):
        print(self.object.pk)
        return reverse_lazy('detalji_rn', kwargs={'pk': self.object.pk})

这里是urls.py:

path('radni_nalozi', views.Radni_nalozi_view.as_view(), name='radni_nalozi'),
    path('radni_nalozi_arhiva', views.Radni_nalozi_arhiva_view.as_view(), name='radni_nalozi_arhiva'),
    path('dodaj_rn', views.RadniCreateView.as_view(), name='dodaj_rn'),
    path('radni_nalozi/details_rn/<pk>', views.RadniDetailView.as_view(), name="detalji_rn"),
    path('radni_nalozi/update/<pk>', views.RadniUpdateView.as_view(), name="update_rn"),
    path('radni_nalozi/delete/<pk>', views.RadniDeleteView.as_view(), name="delete_rn"),

命令print(self.object.pk)returnsNONE虽然创建了对象。如果我在 reverse_lazy 函数中放入一些其他硬编码值(例如数字 13),那么我的视图将执行,它会重定向到硬编码值并打印出命令 print(self.object.pk) 两次,首先使用值 NONE 然后使用刚刚创建的条目的值?

如何在重定向视图之前访问已创建条目的 pk,以便我可以重定向到该已创建条目(工作订单)的详细信息页面?

编辑dodaj_rn.html:

<link rel="stylesheet" href="{% static 'css/forma_add.css' %}">
<div class="container novi_rn">

  <form method="post" action="" class="js-quote-request-form form_dodavanje"" id="quoteForm">
    {% csrf_token %}


   <div class="modal-header">
      <h4 class="modal-title">{{ title }}</h4>
      <!-- <button type="button" class="close" data-dismiss="modal" aria-label="Close">
        <span aria-hidden="true">&times;</span>
      </button> -->
    </div>

    <div class="modal-body">

      {% for field in form %}
        <div class="form-group{% if field.errors %} invalid{% endif %}">
          <label for="{{ field.id_for_label }}">{{ field.label }}</label>
          {{ field }}
          {% for error in field.errors %}
            <p class="help-block">{{ error }}</p>
          {% endfor %}
        </div>
      {% endfor %}
    </div>

    <div class="modal-footer">
      <!-- <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> -->
      <button type="submit" class="btn btn-primary btn-lg">{{ gumb}}</button>
    </div>
  </form>
</div>

编辑 JS 脚本以触发模态表单以创建新条目:

<script type="text/javascript">
$(document).ready(function() {

    $("#create-rn").modalForm({
        formURL: "{% url link %}"
    });

});
</script>

编辑:这是我的 forms.py RadniModelForm。在我将 BSModalModelForm 更改为 forms.ModelForm 并将 BSModalCreateView 更改为仅 CreateView 之后,现在条目已创建并且我得到一个 object.id 但视图不会重定向到详细信息页面。我在控制台中收到错误,您可以在底部看到这些错误。

class RadniModelForm(ModelForm):
    class Meta:
        model = Radni_nalozi
        fields = ["Klijent","Pacijent","Rok_isporuke","Napomene","Zaduzenja"]
        labels = {"Klijent":"Klijent: ", "Pacijent":"Pacijent: ", "Rok_isporuke":"Rok isporuke: ", 
                  "Napomene":"Napomene: ","Zaduzenja":"Zaduženja: "}
        widgets = {'Rok_isporuke': DatePickerInput(options={
                        "locale":"en-gb",
                    })}

编辑:当我将 RadniCreateView class 从 BSModalCreateView 更改为 CreateView 并将 RadniModelForm class 从 BSModalModelForm 更改为 ModelForm(不是 forms.ModelForm)时,重定向有效。但是新条目创建了两次,视图将我重定向到最后一个。

编辑:

好的,我现在明白问题了。您的图书馆正在使用模式。因此,“createview”和“updateview”的 urls 和模板是模态框正常运行的辅助工具。有了这个库,“success_url”就没有意义了,因为模式的想法是集成在父模板中。

如果您想将您的用户重定向到与原始用户不同的另一个 url,请更改“RadniCreateView”的 class:

来自这里:

class RadniCreateView(LoginRequiredMixin,BSModalCreateView):

为此:

class RadniCreateView(LoginRequiredMixin,CreateView):

旧答案:

调用get_success_url()时好像是获取不到对象。我没有看到代码中有任何错误,但我不明白这一行的用处:

context = super(BSModalCreateView, self).get_context_data(**kwargs)

通过更改上下文的 super(),您可能会在错误的 class 中查找对象。如果您为此更改它,也许它会起作用:

context = super(RadniCreateView, self).get_context_data(**kwargs)