让 slugfield 与其他字段具有相同的值
Have slugfield be as the same value as other field
我正在尝试使用与另一个字段相同的值保存一个 Slugfield。
我无法让它工作..
我尝试了以下方法(以及无数其他方法,例如将数据中心文本字段更改为 slugfield.. 根本不起作用)
# View that saves the model to the database:
class save_device(CreateView):
model = AddDevice
form = add_device
fields = ['merk', 'model', 'locatie', 'datacenter', 'device_naam', 'aantal_poorten']
template_name = 'Item/Save_Device.html'
def get(self, request, *args, **kwargs):
device_form = self.form()
context = {'device_form': device_form}
return self.render_to_response(context)
#Model:
class AddDevice(models.Model):
merk = models.CharField(max_length=100)
model = models.CharField(max_length=100)
locatie = models.CharField(max_length=100)
datacenter = models.TextField(max_length=40, null=False)
device_naam = models.CharField(max_length=100)
aantal_poorten = models.CharField(max_length=500)
slug = models.SlugField(null=False)
def get_absolute_url(self):
return reverse('dc_name', kwargs={'slug': self.slug})
# And the urls:
urlpatterns = [
path('<slug:slug>/', dc_view.as_view(), name='dc_name'),
]
Slugfield 保存没有价值。
# Full traceback:
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/save_device/
Django Version: 3.0.5
Python Version: 3.8.0
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'Dokuwiki_updatet']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/views/generic/base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/views/generic/base.py", line 97, in dispatch
return handler(request, *args, **kwargs)
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/views/generic/edit.py", line 172, in post
return super().post(request, *args, **kwargs)
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/views/generic/edit.py", line 142, in post
return self.form_valid(form)
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/views/generic/edit.py", line 126, in form_valid
return super().form_valid(form)
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/views/generic/edit.py", line 57, in form_valid
return HttpResponseRedirect(self.get_success_url())
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/views/generic/edit.py", line 116, in get_success_url
url = self.object.get_absolute_url()
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/Dokuwiki_updatet/models/add_items.py", line 15, in get_absolute_url
return reverse('dc_name', kwargs={'slug': self.slug})
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/urls/base.py", line 87, in reverse
return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/urls/resolvers.py", line 677, in _reverse_with_prefix
raise NoReverseMatch(msg)
Exception Type: NoReverseMatch at /save_device/
Exception Value: Reverse for 'dc_name' with keyword arguments '{'slug': ''}' not found. 1 pattern(s) tried: ['(?P<slug>[-a-zA-Z0-9_]+)/$']
我知道我做错了什么,怀疑是因为我必须覆盖保存功能(?)。我只是不知道去哪里找它..
提前致谢!
您需要对 某些东西 进行 sligify,通常是您的模型中独一无二的东西,例如:
django.utils.text import <b>slugify</b>
class Device(models.Model):
merk = models.CharField(max_length=100)
model = models.CharField(max_length=100)
locatie = models.CharField(max_length=100)
datacenter = models.TextField(max_length=40, null=False<b>, unique=True</b>)
device_naam = models.CharField(max_length=100)
aantal_poorten = models.CharField(max_length=500)
slug = models.SlugField(null=False)
def get_absolute_url(self):
return reverse('dc_name', kwargs={'slug': self.slug})
def save(self, *args, **kwargs):
if self.pk is not None:
slug = <b>sluglify(</b>self.datacenter<b>)</b>
idx = 0
check_slug = slug
while Device.objects.filter(slug=check_slug).exists():
idx += 1
check_slug = '{}{}'.format(slug, idx)
self.slug = check_slug
super().save(*args, **kwargs)
更方便的方法可能是使用 django-autoslug
package [readthedocs]:
from autoslug import AutoSlugField
django.utils.text import <b>slugify</b>
class Device(models.Model):
merk = models.CharField(max_length=100)
model = models.CharField(max_length=100)
locatie = models.CharField(max_length=100)
datacenter = models.TextField(max_length=40, null=False<b>, unique=True</b>)
device_naam = models.CharField(max_length=100)
aantal_poorten = models.CharField(max_length=500)
slug = <b>AutoSlugField(populate_from='datacenter')</b>
def get_absolute_url(self):
return reverse('dc_name', kwargs={'slug': self.slug})
在这种情况下,您不需要自己处理分配 slug 的逻辑。
Note: The name <s>Add</s>Device
is not a good model name. A model stores data about entities, it is not something for "use cases".
我正在尝试使用与另一个字段相同的值保存一个 Slugfield。 我无法让它工作..
我尝试了以下方法(以及无数其他方法,例如将数据中心文本字段更改为 slugfield.. 根本不起作用)
# View that saves the model to the database:
class save_device(CreateView):
model = AddDevice
form = add_device
fields = ['merk', 'model', 'locatie', 'datacenter', 'device_naam', 'aantal_poorten']
template_name = 'Item/Save_Device.html'
def get(self, request, *args, **kwargs):
device_form = self.form()
context = {'device_form': device_form}
return self.render_to_response(context)
#Model:
class AddDevice(models.Model):
merk = models.CharField(max_length=100)
model = models.CharField(max_length=100)
locatie = models.CharField(max_length=100)
datacenter = models.TextField(max_length=40, null=False)
device_naam = models.CharField(max_length=100)
aantal_poorten = models.CharField(max_length=500)
slug = models.SlugField(null=False)
def get_absolute_url(self):
return reverse('dc_name', kwargs={'slug': self.slug})
# And the urls:
urlpatterns = [
path('<slug:slug>/', dc_view.as_view(), name='dc_name'),
]
Slugfield 保存没有价值。
# Full traceback:
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/save_device/
Django Version: 3.0.5
Python Version: 3.8.0
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'Dokuwiki_updatet']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/views/generic/base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/views/generic/base.py", line 97, in dispatch
return handler(request, *args, **kwargs)
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/views/generic/edit.py", line 172, in post
return super().post(request, *args, **kwargs)
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/views/generic/edit.py", line 142, in post
return self.form_valid(form)
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/views/generic/edit.py", line 126, in form_valid
return super().form_valid(form)
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/views/generic/edit.py", line 57, in form_valid
return HttpResponseRedirect(self.get_success_url())
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/views/generic/edit.py", line 116, in get_success_url
url = self.object.get_absolute_url()
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/Dokuwiki_updatet/models/add_items.py", line 15, in get_absolute_url
return reverse('dc_name', kwargs={'slug': self.slug})
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/urls/base.py", line 87, in reverse
return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
File "/Users/nickdevries/PycharmProjects/Dokuwiki_updatet/venv/lib/python3.8/site-packages/django/urls/resolvers.py", line 677, in _reverse_with_prefix
raise NoReverseMatch(msg)
Exception Type: NoReverseMatch at /save_device/
Exception Value: Reverse for 'dc_name' with keyword arguments '{'slug': ''}' not found. 1 pattern(s) tried: ['(?P<slug>[-a-zA-Z0-9_]+)/$']
我知道我做错了什么,怀疑是因为我必须覆盖保存功能(?)。我只是不知道去哪里找它..
提前致谢!
您需要对 某些东西 进行 sligify,通常是您的模型中独一无二的东西,例如:
django.utils.text import <b>slugify</b>
class Device(models.Model):
merk = models.CharField(max_length=100)
model = models.CharField(max_length=100)
locatie = models.CharField(max_length=100)
datacenter = models.TextField(max_length=40, null=False<b>, unique=True</b>)
device_naam = models.CharField(max_length=100)
aantal_poorten = models.CharField(max_length=500)
slug = models.SlugField(null=False)
def get_absolute_url(self):
return reverse('dc_name', kwargs={'slug': self.slug})
def save(self, *args, **kwargs):
if self.pk is not None:
slug = <b>sluglify(</b>self.datacenter<b>)</b>
idx = 0
check_slug = slug
while Device.objects.filter(slug=check_slug).exists():
idx += 1
check_slug = '{}{}'.format(slug, idx)
self.slug = check_slug
super().save(*args, **kwargs)
更方便的方法可能是使用 django-autoslug
package [readthedocs]:
from autoslug import AutoSlugField
django.utils.text import <b>slugify</b>
class Device(models.Model):
merk = models.CharField(max_length=100)
model = models.CharField(max_length=100)
locatie = models.CharField(max_length=100)
datacenter = models.TextField(max_length=40, null=False<b>, unique=True</b>)
device_naam = models.CharField(max_length=100)
aantal_poorten = models.CharField(max_length=500)
slug = <b>AutoSlugField(populate_from='datacenter')</b>
def get_absolute_url(self):
return reverse('dc_name', kwargs={'slug': self.slug})
在这种情况下,您不需要自己处理分配 slug 的逻辑。
Note: The name
<s>Add</s>Device
is not a good model name. A model stores data about entities, it is not something for "use cases".