burke-software / django-mass-edit

Make bulk changes in the Django admin interface
152 stars 67 forks source link

Error mass-editing multiple records with custom primary keys #68

Closed yatahaze closed 2 years ago

yatahaze commented 7 years ago

I'm slightly new to Django so I'm not sure if this is my fault, but these models have been working fine. I get an error when I try to mass update them though.

NoReverseMatch at /admin/inventory/product/
Reverse for 'massadmin_change_view' with arguments '()' and keyword arguments '{'model_name': 'product', 'app_name': 'inventory', 'object_ids': 'MBX-99-888,SIZ-66-6666'}' not found. 1 pattern(s) tried: ['admin/(?P<app_name>[^/]+)/(?P<model_name>[^/]+)-masschange/(?P<object_ids>[\\w,\\.]+)/$']
Request Method: POST
Request URL:    http://192.168.0.15:8005/admin/inventory/product/
Django Version: 1.10
Exception Type: NoReverseMatch
Exception Value:    
Reverse for 'massadmin_change_view' with arguments '()' and keyword arguments '{'model_name': 'product', 'app_name': 'inventory', 'object_ids': 'MBX-99-888,SIZ-66-6666'}' not found. 1 pattern(s) tried: ['admin/(?P<app_name>[^/]+)/(?P<model_name>[^/]+)-masschange/(?P<object_ids>[\\w,\\.]+)/$']
Exception Location: /home/ryan/apps/kingsway/venv/lib/python3.4/site-packages/django/urls/resolvers.py in _reverse_with_prefix, line 389
Python Executable:  /usr/bin/uwsgi
Python Version: 3.4.5
Python Path:    
['.',
 '',
 '/home/ryan/apps/kingsway/venv/lib/python34.zip',
 '/home/ryan/apps/kingsway/venv/lib64/python3.4',
 '/home/ryan/apps/kingsway/venv/lib64/python3.4/plat-linux',
 '/home/ryan/apps/kingsway/venv/lib64/python3.4/lib-dynload',
 '/usr/lib64/python3.4',
 '/usr/lib/python3.4',
 '/home/ryan/apps/kingsway/venv/lib/python3.4/site-packages']
Server time:    Fri, 6 Jan 2017 15:21:16 -0800
Traceback Switch to copy-and-paste view

/home/ryan/apps/kingsway/venv/lib/python3.4/site-packages/django/core/handlers/exception.py in inner
            response = get_response(request) ...
▶ Local vars
/home/ryan/apps/kingsway/venv/lib/python3.4/site-packages/django/core/handlers/base.py in _legacy_get_response
            response = self._get_response(request) ...
▶ Local vars
/home/ryan/apps/kingsway/venv/lib/python3.4/site-packages/django/core/handlers/base.py in _get_response
                response = self.process_exception_by_middleware(e, request) ...
▶ Local vars
/home/ryan/apps/kingsway/venv/lib/python3.4/site-packages/django/core/handlers/base.py in _get_response
                response = wrapped_callback(request, *callback_args, **callback_kwargs) ...
▶ Local vars
/home/ryan/apps/kingsway/venv/lib/python3.4/site-packages/django/contrib/admin/options.py in wrapper
                return self.admin_site.admin_view(view)(*args, **kwargs) ...
▶ Local vars
/home/ryan/apps/kingsway/venv/lib/python3.4/site-packages/django/utils/decorators.py in _wrapped_view
                    response = view_func(request, *args, **kwargs) ...
▶ Local vars
/home/ryan/apps/kingsway/venv/lib/python3.4/site-packages/django/views/decorators/cache.py in _wrapped_view_func
        response = view_func(request, *args, **kwargs) ...
▶ Local vars
/home/ryan/apps/kingsway/venv/lib/python3.4/site-packages/django/contrib/admin/sites.py in inner
            return view(request, *args, **kwargs) ...
▶ Local vars
/home/ryan/apps/kingsway/venv/lib/python3.4/site-packages/django/utils/decorators.py in _wrapper
            return bound_func(*args, **kwargs) ...
▶ Local vars
/home/ryan/apps/kingsway/venv/lib/python3.4/site-packages/django/utils/decorators.py in _wrapped_view
                    response = view_func(request, *args, **kwargs) ...
▶ Local vars
/home/ryan/apps/kingsway/venv/lib/python3.4/site-packages/django/utils/decorators.py in bound_func
                return func.__get__(self, type(self))(*args2, **kwargs2) ...
▶ Local vars
/home/ryan/apps/kingsway/venv/lib/python3.4/site-packages/django/contrib/admin/options.py in changelist_view
                response = self.response_action(request, queryset=cl.get_queryset(request)) ...
▶ Local vars
/home/ryan/apps/kingsway/venv/lib/python3.4/site-packages/django/contrib/admin/options.py in response_action
            response = func(self, request, queryset) ...
▶ Local vars
/home/ryan/apps/kingsway/venv/lib/python3.4/site-packages/massadmin/massadmin.py in mass_change_selected
                "object_ids": ",".join(str(s) for s in selected)}) ...
▶ Local vars
/home/ryan/apps/kingsway/venv/lib/python3.4/site-packages/django/urls/base.py in reverse
    return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))) ...
▶ Local vars
/home/ryan/apps/kingsway/venv/lib/python3.4/site-packages/django/urls/resolvers.py in _reverse_with_prefix
            (lookup_view_s, args, kwargs, len(patterns), patterns) ...
▶ Local vars
Request information

USER
ryan
GET
No GET data
POST
Variable    Value
select_across   
'0'
index   
'0'
csrfmiddlewaretoken 
'OvtfWkdznQIO5bWo5C9icnFO1WcSRQGl7rcNK3inwFGDF4SJgYyKnUJUjoIc2s9Z'
_selected_action    
'SIZ-66-6666'
action  
'mass_change_selected'
FILES
No FILES data
COOKIES
Variable    Value
tabstyle    
'html-tab'
sessionid   
'zkrv0xhrewftu459e3i7tc0sdh9tnpnu'
gsScrollPos 
''
csrftoken   
'yzRMhyze1nq2XxQ6uXYHagmYb6q3M3htRvAk5hE2acoRxqMrFjn9lNq4tyWnXFK7'
META
Variable    Value
CONTENT_LENGTH  
'193'
CONTENT_TYPE    
'application/x-www-form-urlencoded'
CSRF_COOKIE 
'yzRMhyze1nq2XxQ6uXYHagmYb6q3M3htRvAk5hE2acoRxqMrFjn9lNq4tyWnXFK7'
DOCUMENT_ROOT   
'/usr//html'
HTTP_ACCEPT 
'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
HTTP_ACCEPT_ENCODING    
'gzip, deflate'
HTTP_ACCEPT_LANGUAGE    
'en-US,en;q=0.8,it;q=0.6'
HTTP_CACHE_CONTROL  
'max-age=0'
HTTP_CONNECTION 
'keep-alive'
HTTP_CONTENT_LENGTH 
'193'
HTTP_CONTENT_TYPE   
'application/x-www-form-urlencoded'
HTTP_COOKIE 
('gsScrollPos=; sessionid=zkrv0xhrewftu459e3i7tc0sdh9tnpnu; '
 'tabstyle=html-tab; '
 'csrftoken=yzRMhyze1nq2XxQ6uXYHagmYb6q3M3htRvAk5hE2acoRxqMrFjn9lNq4tyWnXFK7')
HTTP_HOST   
'192.168.0.15:8005'
HTTP_ORIGIN 
'http://192.168.0.15:8005'
HTTP_REFERER    
'http://192.168.0.15:8005/admin/inventory/product/'
HTTP_UPGRADE_INSECURE_REQUESTS  
'1'
HTTP_USER_AGENT 
('Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like '
 'Gecko) Chrome/55.0.2883.87 Safari/537.36')
PATH_INFO   
'/admin/inventory/product/'
QUERY_STRING    
''
REMOTE_ADDR 
'192.168.0.2'
REMOTE_PORT 
'63802'
REQUEST_METHOD  
'POST'
REQUEST_URI 
'/admin/inventory/product/'
SCRIPT_NAME 
''
SERVER_NAME 
'kingsway.treasuremart.net'
SERVER_PORT 
'8005'
SERVER_PROTOCOL 
'HTTP/1.1'
uwsgi.core  
33
uwsgi.node  
b'ls4'
uwsgi.version   
b'2.0.13.1'
wsgi.errors 
<_io.TextIOWrapper name=2 mode='w' encoding='ANSI_X3.4-1968'>
wsgi.file_wrapper   
''
wsgi.input  
<uwsgi._Input object at 0x7fa52fbcb918>
wsgi.multiprocess   
False
wsgi.multithread    
True
wsgi.run_once   
False
wsgi.url_scheme 
'http'
wsgi.version    
(1, 0)
Settings
Using settings module mysite.settings
Setting Value
ABSOLUTE_URL_OVERRIDES  
{}
ACCOUNT_ACTIVATION_DAYS 
90
ADMINS  
[]
ALLOWED_HOSTS   
[]
APPEND_SLASH    
True
AUTHENTICATION_BACKENDS 
['django.contrib.auth.backends.ModelBackend']
AUTH_PASSWORD_VALIDATORS    
'********************'
AUTH_USER_MODEL 
'auth.User'
BASE_DIR    
'/home/ryan/apps/kingsway/content'
CACHES  
{'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}}
CACHE_MIDDLEWARE_ALIAS  
'default'
CACHE_MIDDLEWARE_KEY_PREFIX 
'********************'
CACHE_MIDDLEWARE_SECONDS    
600
CSRF_COOKIE_AGE 
31449600
CSRF_COOKIE_DOMAIN  
None
CSRF_COOKIE_HTTPONLY    
False
CSRF_COOKIE_NAME    
'csrftoken'
CSRF_COOKIE_PATH    
'/'
CSRF_COOKIE_SECURE  
False
CSRF_FAILURE_VIEW   
'django.views.csrf.csrf_failure'
CSRF_HEADER_NAME    
'HTTP_X_CSRFTOKEN'
CSRF_TRUSTED_ORIGINS    
[]
DATABASES   
{'default': {'ATOMIC_REQUESTS': False,
             'AUTOCOMMIT': True,
             'CONN_MAX_AGE': 0,
             'ENGINE': 'django.db.backends.postgresql_psycopg2',
             'HOST': 'localhost',
             'NAME': 'kingsway',
             'OPTIONS': {},
             'PASSWORD': '********************',
             'PORT': '5432',
             'TEST': {'CHARSET': None,
                      'COLLATION': None,
                      'MIRROR': None,
                      'NAME': None},
             'TIME_ZONE': None,
             'USER': 'ryan'}}
DATABASE_ROUTERS    
[]
DATA_UPLOAD_MAX_MEMORY_SIZE 
2621440
DATA_UPLOAD_MAX_NUMBER_FIELDS   
1000
DATETIME_FORMAT 
'N j, Y, P'
DATETIME_INPUT_FORMATS  
['%Y-%m-%d %H:%M:%S',
 '%Y-%m-%d %H:%M:%S.%f',
 '%Y-%m-%d %H:%M',
 '%Y-%m-%d',
 '%m/%d/%Y %H:%M:%S',
 '%m/%d/%Y %H:%M:%S.%f',
 '%m/%d/%Y %H:%M',
 '%m/%d/%Y',
 '%m/%d/%y %H:%M:%S',
 '%m/%d/%y %H:%M:%S.%f',
 '%m/%d/%y %H:%M',
 '%m/%d/%y']
DATE_FORMAT 
'N j, Y'
DATE_INPUT_FORMATS  
['%Y-%m-%d',
 '%m/%d/%Y',
 '%m/%d/%y',
 '%b %d %Y',
 '%b %d, %Y',
 '%d %b %Y',
 '%d %b, %Y',
 '%B %d %Y',
 '%B %d, %Y',
 '%d %B %Y',
 '%d %B, %Y']
DEBUG   
True
DEBUG_PROPAGATE_EXCEPTIONS  
False
DECIMAL_SEPARATOR   
'.'
DEFAULT_CHARSET 
'utf-8'
DEFAULT_CONTENT_TYPE    
'text/html'
DEFAULT_EXCEPTION_REPORTER_FILTER   
'django.views.debug.SafeExceptionReporterFilter'
DEFAULT_FILE_STORAGE    
'django.core.files.storage.FileSystemStorage'
DEFAULT_FROM_EMAIL  
'sales@treasuremart.net'
DEFAULT_INDEX_TABLESPACE    
''
DEFAULT_TABLESPACE  
''
DISALLOWED_USER_AGENTS  
[]
EMAIL_BACKEND   
'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST  
'localhost'
EMAIL_HOST_PASSWORD 
'********************'
EMAIL_HOST_USER 
''
EMAIL_PORT  
25
EMAIL_SSL_CERTFILE  
None
EMAIL_SSL_KEYFILE   
'********************'
EMAIL_SUBJECT_PREFIX    
'[Django] '
EMAIL_TIMEOUT   
None
EMAIL_USE_SSL   
False
EMAIL_USE_TLS   
False
FILE_CHARSET    
'utf-8'
FILE_UPLOAD_DIRECTORY_PERMISSIONS   
None
FILE_UPLOAD_HANDLERS    
['django.core.files.uploadhandler.MemoryFileUploadHandler',
 'django.core.files.uploadhandler.TemporaryFileUploadHandler']
FILE_UPLOAD_MAX_MEMORY_SIZE 
2621440
FILE_UPLOAD_PERMISSIONS 
None
FILE_UPLOAD_TEMP_DIR    
None
FIRST_DAY_OF_WEEK   
0
FIXTURE_DIRS    
[]
FORCE_SCRIPT_NAME   
None
FORMAT_MODULE_PATH  
None
IGNORABLE_404_URLS  
[]
INSTALLED_APPS  
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'registration',
 'registration.supplements.default',
 'base_registration',
 'inventory',
 'purchase_orders',
 'invoicing',
 'rest_framework',
 'rest_framework.authtoken',
 'massadmin')
INTERNAL_IPS    
[]
LANGUAGES   
[('af', 'Afrikaans'),
 ('ar', 'Arabic'),
 ('ast', 'Asturian'),
 ('az', 'Azerbaijani'),
 ('bg', 'Bulgarian'),
 ('be', 'Belarusian'),
 ('bn', 'Bengali'),
 ('br', 'Breton'),
 ('bs', 'Bosnian'),
 ('ca', 'Catalan'),
 ('cs', 'Czech'),
 ('cy', 'Welsh'),
 ('da', 'Danish'),
 ('de', 'German'),
 ('dsb', 'Lower Sorbian'),
 ('el', 'Greek'),
 ('en', 'English'),
 ('en-au', 'Australian English'),
 ('en-gb', 'British English'),
 ('eo', 'Esperanto'),
 ('es', 'Spanish'),
 ('es-ar', 'Argentinian Spanish'),
 ('es-co', 'Colombian Spanish'),
 ('es-mx', 'Mexican Spanish'),
 ('es-ni', 'Nicaraguan Spanish'),
 ('es-ve', 'Venezuelan Spanish'),
 ('et', 'Estonian'),
 ('eu', 'Basque'),
 ('fa', 'Persian'),
 ('fi', 'Finnish'),
 ('fr', 'French'),
 ('fy', 'Frisian'),
 ('ga', 'Irish'),
 ('gd', 'Scottish Gaelic'),
 ('gl', 'Galician'),
 ('he', 'Hebrew'),
 ('hi', 'Hindi'),
 ('hr', 'Croatian'),
 ('hsb', 'Upper Sorbian'),
 ('hu', 'Hungarian'),
 ('ia', 'Interlingua'),
 ('id', 'Indonesian'),
 ('io', 'Ido'),
 ('is', 'Icelandic'),
 ('it', 'Italian'),
 ('ja', 'Japanese'),
 ('ka', 'Georgian'),
 ('kk', 'Kazakh'),
 ('km', 'Khmer'),
 ('kn', 'Kannada'),
 ('ko', 'Korean'),
 ('lb', 'Luxembourgish'),
 ('lt', 'Lithuanian'),
 ('lv', 'Latvian'),
 ('mk', 'Macedonian'),
 ('ml', 'Malayalam'),
 ('mn', 'Mongolian'),
 ('mr', 'Marathi'),
 ('my', 'Burmese'),
 ('nb', 'Norwegian Bokmål'),
 ('ne', 'Nepali'),
 ('nl', 'Dutch'),
 ('nn', 'Norwegian Nynorsk'),
 ('os', 'Ossetic'),
 ('pa', 'Punjabi'),
 ('pl', 'Polish'),
 ('pt', 'Portuguese'),
 ('pt-br', 'Brazilian Portuguese'),
 ('ro', 'Romanian'),
 ('ru', 'Russian'),
 ('sk', 'Slovak'),
 ('sl', 'Slovenian'),
 ('sq', 'Albanian'),
 ('sr', 'Serbian'),
 ('sr-latn', 'Serbian Latin'),
 ('sv', 'Swedish'),
 ('sw', 'Swahili'),
 ('ta', 'Tamil'),
 ('te', 'Telugu'),
 ('th', 'Thai'),
 ('tr', 'Turkish'),
 ('tt', 'Tatar'),
 ('udm', 'Udmurt'),
 ('uk', 'Ukrainian'),
 ('ur', 'Urdu'),
 ('vi', 'Vietnamese'),
 ('zh-hans', 'Simplified Chinese'),
 ('zh-hant', 'Traditional Chinese')]
LANGUAGES_BIDI  
['he', 'ar', 'fa', 'ur']
LANGUAGE_CODE   
'en-us'
LANGUAGE_COOKIE_AGE 
None
LANGUAGE_COOKIE_DOMAIN  
None
LANGUAGE_COOKIE_NAME    
'django_language'
LANGUAGE_COOKIE_PATH    
'/'
LOCALE_PATHS    
[]
LOGGING 
{}
LOGGING_CONFIG  
'logging.config.dictConfig'
LOGIN_REDIRECT_URL  
'/accounts/profile/'
LOGIN_URL   
'/accounts/login/'
LOGOUT_REDIRECT_URL 
None
MANAGERS    
[]
MEDIA_ROOT  
''
MEDIA_URL   
''
MESSAGE_STORAGE 
'django.contrib.messages.storage.fallback.FallbackStorage'
MIDDLEWARE  
None
MIDDLEWARE_CLASSES  
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.security.SecurityMiddleware')
MIGRATION_MODULES   
{}
MONTH_DAY_FORMAT    
'F j'
NUMBER_GROUPING 
0
PASSWORD_HASHERS    
'********************'
PASSWORD_RESET_TIMEOUT_DAYS 
'********************'
PREPEND_WWW 
False
REGISTRATION_ACCEPTANCE_EMAIL   
True
REGISTRATION_ACTIVATION_EMAIL   
True
REGISTRATION_BACKEND_CLASS  
'registration.backends.default.DefaultRegistrationBackend'
REGISTRATION_DEFAULT_PASSWORD_LENGTH    
'********************'
REGISTRATION_DJANGO_AUTH_URLS_ENABLE    
True
REGISTRATION_DJANGO_AUTH_URL_NAMES_PREFIX   
''
REGISTRATION_DJANGO_AUTH_URL_NAMES_SUFFIX   
''
REGISTRATION_OPEN   
True
REGISTRATION_REGISTRATION_EMAIL 
True
REGISTRATION_REJECTION_EMAIL    
True
REGISTRATION_SUPPLEMENT_ADMIN_INLINE_BASE_CLASS 
'registration.admin.RegistrationSupplementAdminInlineBase'
REGISTRATION_SUPPLEMENT_CLASS   
'base_registration.models.MyRegistrationSupplement'
REGISTRATION_USE_OBJECT_PERMISSION  
False
REST_FRAMEWORK  
{'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework.authentication.TokenAuthentication',
                                    'rest_framework.authentication.SessionAuthentication'),
 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated',
                                'rest_framework.permissions.IsAdminUser')}
ROOT_URLCONF    
'mysite.urls'
SECRET_KEY  
'********************'
SECURE_BROWSER_XSS_FILTER   
False
SECURE_CONTENT_TYPE_NOSNIFF 
False
SECURE_HSTS_INCLUDE_SUBDOMAINS  
False
SECURE_HSTS_SECONDS 
0
SECURE_PROXY_SSL_HEADER 
None
SECURE_REDIRECT_EXEMPT  
[]
SECURE_SSL_HOST 
None
SECURE_SSL_REDIRECT 
False
SERVER_EMAIL    
'root@localhost'
SESSION_CACHE_ALIAS 
'default'
SESSION_COOKIE_AGE  
1209600
SESSION_COOKIE_DOMAIN   
None
SESSION_COOKIE_HTTPONLY 
True
SESSION_COOKIE_NAME 
'sessionid'
SESSION_COOKIE_PATH 
'/'
SESSION_COOKIE_SECURE   
False
SESSION_ENGINE  
'django.contrib.sessions.backends.db'
SESSION_EXPIRE_AT_BROWSER_CLOSE 
False
SESSION_FILE_PATH   
None
SESSION_SAVE_EVERY_REQUEST  
False
SESSION_SERIALIZER  
'django.contrib.sessions.serializers.JSONSerializer'
SETTINGS_MODULE 
'mysite.settings'
SHORT_DATETIME_FORMAT   
'm/d/Y P'
SHORT_DATE_FORMAT   
'm/d/Y'
SIGNING_BACKEND 
'django.core.signing.TimestampSigner'
SILENCED_SYSTEM_CHECKS  
[]
STATICFILES_DIRS    
[]
STATICFILES_FINDERS 
['django.contrib.staticfiles.finders.FileSystemFinder',
 'django.contrib.staticfiles.finders.AppDirectoriesFinder']
STATICFILES_STORAGE 
'django.contrib.staticfiles.storage.StaticFilesStorage'
STATIC_ROOT 
'/home/ryan/apps/kingsway/content/static'
STATIC_URL  
'/static/'
TEMPLATES   
[{'APP_DIRS': True,
  'BACKEND': 'django.template.backends.django.DjangoTemplates',
  'DIRS': [],
  'OPTIONS': {'context_processors': ['django.template.context_processors.debug',
                                     'django.template.context_processors.request',
                                     'django.contrib.auth.context_processors.auth',
                                     'django.contrib.messages.context_processors.messages']}}]
TEST_NON_SERIALIZED_APPS    
[]
TEST_RUNNER 
'django.test.runner.DiscoverRunner'
THOUSAND_SEPARATOR  
','
TIME_FORMAT 
'P'
TIME_INPUT_FORMATS  
['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
TIME_ZONE   
'America/Vancouver'
USE_ETAGS   
False
USE_I18N    
True
USE_L10N    
True
USE_THOUSAND_SEPARATOR  
False
USE_TZ  
True
USE_X_FORWARDED_HOST    
False
USE_X_FORWARDED_PORT    
False
WSGI_APPLICATION    
'mysite.wsgi.application'
X_FRAME_OPTIONS 
'SAMEORIGIN'
YEAR_MONTH_FORMAT   
'F Y'
_REGISTRATION_ADMIN_REQ_ATTR_NAME_IN_MODEL_INS  
'_registration_admin_request'
You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard page generated by the handler for this status code.

model:

class Product(models.Model):
    # Description
    name                        = models.CharField(max_length=200)
    description                 = models.TextField(blank=True)

    # Price
    price                       = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
    cost_markup                 = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)

    cost_msrp                   = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
    cost_wholesale              = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)
    cost_distributor            = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)

    cost_discount_msrp          = models.IntegerField(blank=True, null=True)
    cost_discount_wholesale     = models.IntegerField(blank=True, null=True)
    cost_discount_distributor   = models.IntegerField(blank=True, null=True)

    # Specs
    model               = models.CharField(max_length=32, primary_key=True)         # PRIMARY KEY
    sku                 = models.CharField(max_length=32, blank=True)               # Vendor Part Number
    upc                 = models.BigIntegerField(blank=True, null=True)
    slug                = models.SlugField(('slug'), max_length=60, blank=True)

    # Specs
    dimensions_length   = models.IntegerField(blank=True, null=True)
    dimensions_width    = models.IntegerField(blank=True, null=True)
    dimensions_height   = models.IntegerField(blank=True, null=True)
    dimensions_depth    = models.IntegerField(blank=True, null=True)
    weight              = models.DecimalField(max_digits=6, decimal_places=2, blank=True, null=True)

    # Inventory
    qty_on_hand         = models.IntegerField(default=0)

    # Data
    active              = models.BooleanField(default=False)
    date_created        = models.DateTimeField(
        default=timezone.now, editable=False)
    date_updated        = models.DateTimeField(auto_now=True)

    dwo_choices         = ('Supplier', 'Us', 'Active')
    dwo                 = models.CharField(choices=Choices(*dwo_choices), max_length=24, blank=True, default='Active')

    # Selectors
    themes              = models.ManyToManyField(   Theme,          related_name='products', blank=True)
    colors              = models.ManyToManyField(   Color,          related_name='products', blank=True)
    product_types       = models.ManyToManyField(   ProductType,    related_name='products', blank=True)
    designer            = models.ForeignKey(        Designer,       related_name='products', blank=True, null=True)
    brand               = models.ForeignKey(        Brand,          related_name='products', blank=True, null=True)
    product_class       = models.ForeignKey(        ProductClass,   related_name='products', blank=True, null=True)

    class Meta:
        ordering = ['brand__name', 'name']
        permissions = (("can_inv_mgmt", "Can manage inventory"),)

    #Then override models save method:
    def save(self, *args, **kwargs):
        if not self.model:
            #Only set the slug when the object is created.
            self.slug = slugify(self.name) #Or whatever you want the slug to use
        super(Product, self).save(*args, **kwargs)

    def __str__(self):
        return self.model
neingeist commented 6 years ago

In my case, using 3.1, I had to adjust the regex in urls.py for object_ids to include all characters in my primary key. However, judging from the changes in urls.py, your problem with your particular ids should be fixed with 3.0, as the dash - was added to the regex.

PetrDlouhy commented 2 years ago

I am changing the url function to path and using string converter for object_ids. Can you please confirm, that it works with the newest master branch?

It would also be nice, if you could make test case for this.

yatahaze commented 2 years ago

I never updated this, but it's been working :)