Python Django. 没有重定向的 URL。请提供 URL 或在模型上定义 get_absolute_url 方法

0 投票
0 回答
15 浏览
提问于 2025-04-12 00:53

大家好。我遇到了一个问题,无法解决。在模型中已经定义了 get_absolute_url,但我却收到了一个错误提示:“没有可重定向的 URL。要么提供一个 URL,要么在模型中定义一个 get_absolute_url 方法。”

这是我的代码(models.py):

class Vendor(models.Model):
    name = models.CharField(max_length=255, default='')
    vendor_type = models.ForeignKey('VendorType', on_delete=models.PROTECT, null=False)

    def __str__(self):
        return self.name
    
    def get_absolute_url(self):
        return reverse_lazy('motherboard_vendors')

class VendorType(models.Model):
    class Type(models.IntegerChoices):
        MOTHERBOARD = 1, 'Материнская плата'
        CPU = 2, 'Процессор'
        STORAGE = 3, 'Накопитель памяти'
        VIDEOCARD = 4, 'Видеокарта'
        RAM = 5, 'Оперативная память'
        MONITOR = 6, 'Монитор'
        SOFTWARE = 7, 'Программное обеспечение'
        PROJECTOR = 8, 'Проектор'
        PRINTER = 9, 'Принтер'

    name = models.CharField(choices=Type.choices, max_length=255, default='')

    def __str__(self):
        return self.name
    
    def get_absolute_url(self):
        return reverse_lazy('motherboards')

forms.py:

class AddMotherboardVendorForm(forms.ModelForm):
    class Meta:
        model = Vendor
        fields = ['name']
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form-input'}),
        }

    def clean_name(self):
        name = self.cleaned_data['name']
        if len(name) > 50:
            raise ValidationError("Длина превышает 50 символов")
        return name
    
    def save(self):
        vendor = super().save(commit=False)
        vendor.vendor_type_id = VendorType.Type.MOTHERBOARD
        vendor.save()
        return vendor.get_absolute_url()

views.py:

class AddMotherboardVendor(LoginRequiredMixin, CreateView):
    form_class = AddMotherboardVendorForm
    template_name = "home/motherboard/addmotherboardvendor.html"
    title_page = 'Добавление производителя материнской платы'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['title'] = self.title_page
        return context

urls.py:

path('motherboard_vendors/add_motherboard_vendor/', views.AddMotherboardVendor.as_view(), name='add_motherboard_vendor')

之前有一个叫 Vendor 的实体:

 class MotherboardVendor(models.Model):
     motherboard_vendor_name = models.CharField(max_length=255, default='')

     def __str__(self):
         return self.motherboard_vendor_name
    
     def get_absolute_url(self):
         return reverse_lazy('motherboard_vendors')

但是,一旦我替换了它,错误就开始出现了:“没有可重定向的 URL。要么提供一个 URL,要么在模型中定义一个 get_absolute_url 方法。”我尝试删除数据库和迁移文件,然后重新创建,但没有看到任何新变化。我还完全重建了项目,也没有帮助。在其他所有定义了 get_absolute_url 的模型中,一切都正常。有没有人遇到过类似的问题,能告诉我问题出在哪里吗?

我尝试在 AddMotherboardVendorForm 表单中添加 def get_success_url(),但也得到了同样的错误。

0 个回答

暂无回答

撰写回答