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">×</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)
我有一个我无法弄清楚的问题。 创建工作订单后,我想重定向到该工作订单的详细信息页面。 这是我的 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">×</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)