Django community: RSS
This page, updated regularly, aggregates Django Q&A from the Django community.
-
Django doesnt' read second templatetags folder
Say I have a project and two registered apps. Inside my apps I created templatetags package with custom tags that I want to use in corresponding html templates: Project --App1 | |----templatetags | |----custom_tags.py |----__init__.py --App2 | |----templatetags | |----custom_tags.py |----__init__.py And it looks like django sees only one templatetags folder. I use {% load custom_tags %} in html templates in both apps. When there is only one templatetags folder then corresponding custom tags work (so there is no error in custom_tags.py). I tried to rename one file to eg 'custom_tags_app1' and then {% load custom_tags_app1 %} in html templates in app1, but then it throws error saying: 'custom_tags_app1' is not a registered tag library. Must be one of: . . custom_tags ... When I renamed it I tried to import 'custom_tags_app1' in the shell and it worked What am I missing here? What should I do to make it work, when they both work independently, but don't work together? -
Cannot open ContentFile containing BytesIO content again once it is closed
Once a ContentFile object containing binary data is closed, it isn't possible to open it again: >>> content = ContentFile(b'\x00\x01\x00\x02\x00\x00\x00\x03') >>> content.closed False >>> content.file <_io.BytesIO object at 0x7fa0cd33c8e0> >>> content.file.closed False >>> content.file.close() >>> content.file.closed True >>> content.closed True >>> content.open() *** ValueError: I/O operation on closed file. >>> content.read() *** ValueError: I/O operation on closed file. >>> content.file.read() *** ValueError: I/O operation on closed file. This process naturally occurs when a serializer writes a content file to a field, making it impossible to open the file from memory later on during another process without downloading it first. Versions: Python 3.6 Django 1.11 -
How to get dictionary value in Django Template with Key
I have two dict in my view function policy = {{'policy_no':'123'},{'policy':'456'}} claim = {{'123':'ACTIVE'}} In my template file I dont want to iterate 'claim' dict. view.py policies = {{'policy_no':'123'},{'policy':'456'}} claims = {{'123':'ACTIVE'}} template file {% for policy in policies %} {{claims[policy.policy_no]}} # I want to access directly 'ACTIVE' {% endfor %} -
Python testing: mocking a function that's imported AND used inside another funciton
Due to circular-import issues which are common with Celery tasks in Django, I'm often importing Celery tasks inside of my methods, like so: # some code omitted for brevity # accounts/models.py def refresh_library(self, queue_type="regular"): from core.tasks import refresh_user_library refresh_user_library.apply_async( kwargs={"user_id": self.user.id}, queue=queue_type ) return 0 In my pytest test for refresh_library, I'd only like to test that refresh_user_library (the Celery task) is called with the correct args and kwargs. But this isn't working: # tests/test_accounts_models.py @mock.patch("accounts.models.UserProfile.refresh_library.refresh_user_library") def test_refresh_library(): Error is about refresh_library not having an attribute refresh_user_library. I suspect this is due to the fact that the task(refresh_user_library) is imported inside the function itself, but I'm not too experienced with mocking so this might be completely wrong. -
Problem with 'Cannot assign' error in django
I have something like this in my template. <form action="" method="POST"> {% csrf_token %} <select name='section'> {% for item in all_sections %} <option>{{ item.SectionName }}</option> {% endfor %} </select> </form> and in my view.py page: obj=models.Section.objects.all() context={ 'all_sections':obj, } return render(request,'matab/add-service.html',context) but i get this is error while saving data: Cannot assign "'{item}'": "Services.Section" must be a "Section" instance. also my models.py is like this: class Section(models.Model): SectionName=models.CharField(max_length=50) SectionId=models.CharField(max_length=10) class Services(models.Model): Section=models.OneToOneField( Section, on_delete=models.CASCADE, ) how can i solve it? -
"http://127.0.0.1:8000/ might be temporarily down" after dockerized badgr-server
I'm trying to dockerize django/python project cold badgr-server from here: https://github.com/concentricsky/badgr-server I succeed to deployed it on localhost on ubuntu 18.04 without docker. the build went well. when I did : docker container run -it -p 8000:8000 badgr python root/badgr/code/manage.py runserver and there is nothing on localhost:8000 note: docker container run -it -p 8000:8000 badgr python ./manage.py won't work. output: ?: (rest_framework.W001) You have specified a default PAGE_SIZE pagination rest_framework setting,without specifying also a DEFAULT_PAGINATION_CLASS. HINT: The default for DEFAULT_PAGINATION_CLASS is None. In previous versions this was PageNumberPagination. If you wish to define PAGE_SIZE globally whilst defining pagination_class on a per-view basis you may silence this check. System check identified 1 issue (0 silenced). August 06, 2019 - 10:01:22 Django version 1.11.21, using settings 'mainsite.settings_local' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. I changed in setting_local.py the ALLOWED_HOSTS to : ALLOWED_HOSTS = ['*'] Thanks! ** extra advises are more than welcome!** this is the Dockerfile : FROM ubuntu:18.04 # Preparation RUN apt-get update # Install server dependencies RUN apt-get install -y curl git git-core python-virtualenv gcc python-pip python-dev libjpeg-turbo8 libjpeg-turbo8-dev zlib1g-dev libldap2-dev libsasl2-dev swig libxslt-dev automake autoconf libtool libffi-dev libcairo2-dev libssl-dev RUN pip install virtualenv --upgrade #RUN … -
While using reverse for redirecting, passing optional kwargs is causing the url to retain the parameter always
When I am using reverse() to redirect to a different view with some optional kwargs, as a response from the view I want to display an alert message on load of a template if a key is passed in context dictionary based on that kwarg arg which came in. This is happening fine. But as the url contains the optional path parameter any call to same view with filters is displaying the alert again and again.I want to remove that optional path parameter on display of that alert. This is my view to calling reverse - return HttpResponseRedirect(reverse('data_asset_formats_msg', kwargs={'msg':"Unauthorized to delete DAF-%s"%data_asset_format.data_asset_format_id})) This is my urls - url(r'^data_asset_format/(?P<msg>.*)/', views.data_asset_formats, name='data_asset_formats_msg'), This is the implementation of the view data_asset_formats - def data_asset_formats(request, **kwargs): logr.info(kwargs) msg = kwargs.get('msg', '') logr.info(msg) data_asset_format_list = EdfDataAssetFormat.objects.order_by('data_asset_format_name') field_filter = DataAssetFormatFilter(request.GET, queryset=data_asset_format_list) context = {'data_asset_format_list': data_asset_format_list, 'filter': field_filter, 'msg':msg} return render(request, 'edf/data_asset_formats.html', context) In the template - edf/data_asset_formats.html <script> {% if msg %} var msg = '{{msg}}'; alert(msg); {% endif %} </script> As the url path param contains the optional argument whenever the filters are filtering on this form , the param is passed along and the alter is shown on any search. I want the template … -
Converting attributes of class to a django models subclass
I have a bunch of classes that I'm now trying to incorporate into django. For example, I have a Base class that all my other classes derive from: class Base: def __init__(self, label: str = 'Base'): self.label = label An example of a sublcass would be a Person class: from typing import Any, Dict class Person(Base): def __init__(self, name: str, attributes_to_options: Dict[str, Any], **kwargs): super().__init__(**kwargs) self.name = name self.attributes_to_options = attributes_to_options I would use this as: alex = Person(name='Alex', attributes_to_options={'age': 10, 'is_happy': True}, label='Person:Alex') My question is, how do I incorporate such a class into django? Is it as simple as inheritting from models.Model? e.g. from django.db import models class Person(Base, models.Model): def __init__(self, name: str, attributes_to_options: Dict[str, Any], **kwargs): super().__init__(**kwargs) self.name = name self.attributes_to_options = attributes_to_options But then how do I specify the models.CharField for the two attributes name and attributes_to_options? Thanks for any help here. -
Django uninstalled after installing django-debug-toolbar in docker container, how to install it without un installing django?
I was trying to install django debug toolbar in my container using [shub@debian teamwave](task-details-api)$ docker exec -it teamwave_backend_1 pip install django-debug-toolbar Collecting django-debug-toolbar Downloading https://files.pythonhosted.org/packages/01/9a/3db232bd15882d90d3c53de1f34ce0a522327849593c9198899713267cfe/django_debug_toolbar-1.11-py2.py3-none-any.whl (201kB) 100% |████████████████████████████████| 204kB 426kB/s Collecting sqlparse>=0.2.0 (from django-debug-toolbar) Downloading https://files.pythonhosted.org/packages/ef/53/900f7d2a54557c6a37886585a91336520e5539e3ae2423ff1102daf4f3a7/sqlparse-0.3.0-py2.py3-none-any.whl Collecting Django>=1.11 (from django-debug-toolbar) Downloading https://files.pythonhosted.org/packages/61/cb/e3c6bfccdf23c48dd4ce014b96178aa048b9450739eaa5f11d4d23d9d5d6/Django-1.11.23-py2.py3-none-any.whl (6.9MB) 100% |████████████████████████████████| 7.0MB 544kB/s Requirement already satisfied: pytz in /usr/local/lib/python2.7/site-packages (from Django>=1.11->django-debug-toolbar) (2015.2) Installing collected packages: sqlparse, Django, django-debug-toolbar Found existing installation: sqlparse 0.1.15 Uninstalling sqlparse-0.1.15: Successfully uninstalled sqlparse-0.1.15 Found existing installation: Django 1.8.18 Uninstalling Django-1.8.18: I have tried running the container and installing the django Starting teamwave_backend_1 ... done Attaching to teamwave_backend_1 backend_1 | Traceback (most recent call last): backend_1 | File "manage.py", line 8, in <module> backend_1 | from django.core.management import execute_from_command_line backend_1 | ImportError: No module named django.core.management teamwave_backend_1 exited with code 1 I later fixed my django by docker-compose build but I want django-debug-toolbar too. This is my docker-compose.yml version: '3' services: db: image: postgres:10-alpine environment: - POSTGRES_PASSWORD=dsdbadmin - POSTGRES_DB=tm_v1.1 volumes: - pgdata:/var/lib/postgresql/data - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d backend: build: . volumes: - .:/backend ports: - "8000:8000" depends_on: - db - redis redis: image: redis:4-alpine volumes: pgdata: And this is my Dockerfile FROM python:2 ENV PYTHONUNBUFFERED 1 WORKDIR /backend ADD req.txt /backend/ RUN pip install --upgrade … -
Wrong Return in Django TruncWeek
TruncDate and TruncMonth Return Right Data , but when using TruncWeek the Data not return like i am using TruncMonth/Date two function models using TruncDate and TruncMonth running well, and TruncWeek Should Running necessarily class TblogByDateSerializer(serializers.ModelSerializer): groupby = serializers.CharField() total = serializers.IntegerField() class Meta: model = Tblog fields = ('groupby','total') Queryset : Tblog.objects.filter(status='success').annotate(groupby=TruncMonth('createtime',output_field=DateField())).values('groupby').annotate(total=Count('createtime')).order_by('-groupby')[:7] if i change the TruncMonth function to TruncWeek the code should Grouping By Week, the result when i am using Using TruncMonth and Using TruncDate this is the problem when Using TruncWeek -
UnboundLocalError at / local variable 'Profile' referenced before assignment?
How to solve this issue of UnboundLocalError at /profile/ local variable 'context' referenced before assignment. I am seeing it to be okay? When I remove Payment_method dropdown menu,, it works but why it is not working with dropdown menu? models.py Paymet_choices = ( ('easypaisa','EasyPaisa Number'), ('jazzcash', 'Jazzcash Number'), ) class Profile(models.Model): payment_method = models.CharField(max_length=6, choices=Paymet_choices) forms.py class ProfileUpdateForm(forms.ModelForm): class Meta: model = Profile fields = ['image','Payment_method','Detail'] views.py def profile(request): if request.method == 'POST': u_form = UserUpdateForm(request.POST, instance=request.user) p_form = ProfileUpdateForm(request.POST, request.FILES, instance=request.user.profile) if u_form.is_valid() and p_form.is_valid(): u_form.save() p_form.save() messages.success(request, f'Your account has been updated!') return redirect('profile') else: u_form = UserUpdateForm(instance=request.user) p_form = ProfileUpdateForm(instance=request.user.profile) context = { 'u_form': u_form, 'p_form': p_form } return render(request, 'users/profile.html', context) -
Django model translation
What is the best way to have model fields translated in Django? I've thought about adding extra fields to the model (one field for language) or creating another model with all texts in every language, is there a recommended way to achieve that? Thank you very much -
How to override a package method in Django?
I'm trying to override a parent class method that I've installed via pip. But, the problem is that I'm not sure how my overridden class will be called so that it will use my method instead of parent class method. This is the method I'm trying to override: class OIDCAuthenticationBackend(ModelBackend): def verify_claims(self, claims): """Verify the provided claims to decide if authentication should be allowed.""" # Verify claims required by default configuration scopes = self.get_settings('OIDC_RP_SCOPES', 'openid email') if 'email' in scopes.split(): return 'email' in claims LOGGER.warning('Custom OIDC_RP_SCOPES defined. ' 'You need to override `verify_claims` for custom claims verification.') return True And my overridden method is : models.py from mozilla_django_oidc.auth import OIDCAuthenticationBackend class MyOIDCAB(OIDCAuthenticationBackend): def verify_claims(self, claims): return True I've written this on models.py according to some docs I read for overriding but I'm not sure where should I actually write this. then trying to call it from my view functions like this: views.py from myapp import MyOIDCAB but then I got this error: from myapp import MyOIDCAB ImportError: cannot import name 'MyOIDCAB' I'm not sure I'm calling it in the right way or wrong? My project structure is: myproject myapp templates manage.py -
how to fix error: literal for int() with base 10: b'12 21:00:00'
i have a search form that allow user to search for records stored in the database. the problem is once the user submit the form the system display the below error: ValueError at /folder/search/ invalid literal for int() with base 10: b'12 21:00:00' Request Method: GET Request URL: http://127.0.0.1:8000/folder/search/?q=3342 Django Version: 2.1.3 Exception Type: ValueError Exception Value: invalid literal for int() with base 10: b'12 21:00:00' Exception Location: C:\Users\LT GM\AppData\Local\Programs\Python\Python37\lib\sqlite3\dbapi2.py in convert_date, line 64 Python Executable: C:\Users\LT GM\AppData\Local\Programs\Python\Python37\python.exe Python Version: 3.7.1 fullTraceback Environment: Request Method: GET Request URL: http://127.0.0.1:8000/folder/search/?q=3342 Django Version: 2.1.3 Python Version: 3.7.1 Installed Applications: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog', 'widget_tweaks', 'import_export'] 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: File "C:\Users\LT GM\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\exception.py" in inner 34. response = get_response(request) File "C:\Users\LT GM\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\base.py" in _get_response 126. response = self.process_exception_by_middleware(e, request) File "C:\Users\LT GM\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\base.py" in _get_response 124. response = wrapped_callback(request, *callback_args, **callback_kwargs) File "C:\Users\LT GM\Desktop\ABenvironment\myABenv\ABdatabase\views.py" in searchFolder 252. ListID = list(FilterQuery) File "C:\Users\LT GM\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\models\query.py" in iter 268. self._fetch_all() File "C:\Users\LT GM\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\models\query.py" in _fetch_all 1186. self._result_cache = list(self._iterable_class(self)) File "C:\Users\LT GM\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\models\query.py" in iter 54. results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size) File "C:\Users\LT GM\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\models\sql\compiler.py" in execute_sql 1065. cursor.execute(sql, params) File "C:\Users\LT GM\AppData\Local\Programs\Python\Python37\lib\site-packages\django\db\backends\utils.py" in execute 100. return super().execute(sql, params) File "C:\Users\LT … -
Django sessions: How to include session ID in every log record?
I would like to include session ID (at least portion of it) in every log entry in Django. This would help me group together logs for each user session in case several users are interacting with my Django API at the same time. I know I can retrieve session ID from Request object (when it exists) but I would have to do so for every logger.info() across the whole framework. Instead it would be much better to have Request somehow available in settings.py so that I can prepend the ID to my formatter's format string inside LOGGING config. This would ensure that the session ID is included in every log entry and I would not need to think about it in every view or serializer, etc. But I haven't found a way how to make Request or Session available in settings.py. -
Django - update dictionary with missing date values, set to 0
So to display a small bargraph using Django and Chart.js I constructed the following query on my model. views.py class BookingsView(TemplateView): template_name = 'orders/bookings.html' def get_context_data(self, **kwargs): today = datetime.date.today() seven_days = today + datetime.timedelta(days=7) bookings = dict(Booking.objects.filter(start_date__range = [today, seven_days]) \ .order_by('start_date') \ .values_list('start_date') \ .annotate(Count('id'))) # Trying to add 0 for the missing start_date within the range for start_date in (seven_days): if start_date not in bookings: bookings.update({start_date : 0}) context['booking_list'] = bookings This led me to the following result; { datetime.date(2019, 8, 6): 12, datetime.date(2019, 8, 7): 12, datetime.date(2019, 8, 9): 4, datetime.date(2019, 8, 10): 7, datetime.date(2019, 8, 12): 7 } To use the data in a chart I would like to add the missing start_dates into the dictionary but I'm not entirely sure how to do this. So I want to update the dictionary with a value "0" for the 8th and 11th of August. I tried to add the for statement but I got the error; "'datetime.date' object is not iterable" -
Why does Form submit data by POST only once in a while and then it shows an empty POST dict?
I have a simple form which asks the user to confirm Delete by clicking on Yes or No . The Yes/No (radio buttons with hidden inputs) are attached to a function which immediately submits the form on click of either of the buttons via POST. The Problem is that on submit , the POST data is shown empty , and page redirects to home page without any action . I am building it on Django 2.2. I tried changing the radio buttons to text inputs and then assigning values to them on click of Yes/No and submit the form . That too shows an empty POST Data . But yes , once in a while it works , but then it doesn't . <form method='POST' action="/{{user}}/{{del_id}}/delete"> {% csrf_token %} <h2>Confirm Delete ?</h2> <h3> {{to_delete}} </h3> <img src="" alt="" class="thumb-square"> <br> <br> <p class="center-text">This won't be recovered</p> <label id='no' data-value='Yes' class="danger-btn" onclick="submitForm(this.id)">Yes</label> <input type="text" name='Yes' id='Yes' hidden> <label id='yes' data-value='No' class="success-btn" onclick="submitForm(this.id)">No</label> <input type="text" name='No' id='No' hidden> <input type="submit" value="Delete" id='submit' hidden> </form> JavaScript <script> function submitForm(elem) { console.log(elem); var x = document.getElementById(elem); console.log(x); document.getElementById(elem).value = x.getAttribute('value'); document.getElementById('submit').click(); } </script> I want that the request.POST['Yes'] should have a value of 'Yes' … -
Django: How to prompt user during migration?
I'm writing a migration that converts a ForeignKeyField to a ManyToManyField. Part of this migration involves data migration. Migrating forwards is easy and requires no user interaction. Migrating backwards however ideally requires the user to pick which of the m2m to become the foreign key (ie there's a recognition of data loss). Additionally. the user performing the migration might want to be given a python shell so they can poke around and look at objects before answering the question. And some users might not care, and might not want to be prompted at all. (ie they use the --no-input argument during migration) Does django have a built in mechanism to do all this? I can't find anything, but at the back of my mind it seems like something I've seen somewhere. -
How to Streaming in django - javascript for audio files
first , sorry my english skill :( i want to audio file Streaming in django-javascript Once the user enters the text, they will need to create and stream audio files from it. So when users stream, does the file exist on the django server? Or how? I am curious about the way users are provided. -
How to display django message after uploading an image in form?
I created a simple django html page which enables a user to upload an image. If the image format is either PNG, JPG, JPEG or SVG, it should display a message called "Image uploaded successfully" and save the file in the directory. But, if it's any other format apart from this, it should give a message: "Unsuccessful, please upload either in PNG, JPG, SVG or JPEG". How do I display the message? I tried using the SuccessMessageMixin but it displays the message for both success and failure uploads. Please do help. You can view my current code below: models.py: from django.db import models import os from PIL import Image from datetime import date import datetime def get_directory_path(instance, filename): file_extension = os.path.splitext(filename) today = date.today() t = datetime.datetime.now() day, month, year = today.day, today.month, today.year hour, minutes, seconds = t.hour, t.minute, t.second if file_extension[1] in ['.jpg','.png','.jpeg','.svg']: filename = str(day) + str(month) + str(year) + str(hour) + str(minutes) + str(seconds) + '.png' dir = 'media' else: dir = 'others' path = '{0}/{1}'.format(dir, filename) return path # Create your models here. class Image(models.Model): image = models.FileField(upload_to = get_directory_path, default = 'media/sample.png') created_date = models.DateTimeField(auto_now = True) def __str__(self): return str(self.id) views.py: from django.shortcuts … -
join() argument must be str or bytes, not 'dict' in Django while making a form with Multi-Table inheritance
I am trying to create a form for a model that inherits from the Django auth.User class I got this issue. is there a better way to achieve it? #models.py class Teacher(User): tutor = models.OneToOneField(User, on_delete=models.CASCADE, parent_link=True) department = models.CharField(max_length=100) contact_no = models.BigIntegerField() def __str__(self): return "%s %s" % (self.tutor.first_name, self.tutor.last_name) #Forms.py class TeacherForm(forms.ModelForm): class Meta: model = Teacher fields = ('username', 'first_name', 'last_name', 'email', 'contact_no', 'department') Django Version: 2.2.3 Exception Type: TypeError Exception Value: join() argument must be str or bytes, not 'dict' -
Select a valid choice. ["objects"] is not one of the available choices. in Djngo
I'm going to create a form where the user can select any number of objects from the options.(MultipleChoiceField) Here are my files: OBJECT_CHOICES = ( ('1','object1'), ('2','object2'), ('3','object3'), ) # Models.py Class ObjectModel(models.Model): objects = models.CharField(max_length=250, choices=DAY_CHOICES) # Forms.py class ObjectsForm(ModelForm): objects = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, choices=OBJECT_CHOICES) class Meta: model = ObjectModel fields = '__all__' When I click on the submit button (for example select object 1 and 2), I get this error: Select a valid choice. ['1', '2'] is not one of the available choices.- -
LinkedIn Auth v.20 extra data setting in settings.py LinkedIn
I am trying to let users log in with LinkedIn but I couldn't find the clear documentation on field selectors and extra data settings for lite profile not basic profile. Here is in settings.py. SOCIAL_AUTH_LINKEDIN_OAUTH2_SCOPE = ['r_liteprofile', 'r_emailaddress'] SOCIAL_AUTH_LINKEDIN_OAUTH2_FIELD_SELECTORS = ['email-address', 'first-name', 'last-name', 'picture-url'] SOCIAL_AUTH_LINKEDIN_OAUTH2_EXTRA_DATA = [ ('id', 'id'), ('first-name', 'first_name'), ('last-name', 'last_name'), ('email-address', 'email_address'), ('picture-url', 'picture_url'), ] Are these correct? Is there a good reference site for this? -
Is there a way to separate "addtocart" and "buynow" from the same form?
I'm making a e-commerce website, right now I have a buy now button, when pressed will add item to cart and redirect to "cart" page, I want to have a "addtocart" botton which will add the product to card but won't redirect under the same function. Please help me carts/modes.py def buy_now(request, slug): request.session.set_expiry(120000) try: the_id = request.session['cart_id'] except: new_cart = Cart() new_cart.save() request.session['cart_id'] = new_cart.id the_id = new_cart.id cart = Cart.objects.get(id=the_id) try : product = Product_info.objects.get(slug=slug) except Product_info.DoesNotExist: pass product_var = [] if request.method == 'POST': qty = request.POST['qty'] for item in request.POST: key = item val = request.POST[key] print(key,val) try: v = Variation.objects.get(product = product,cat__iexact=key,title__iexact=val) product_var.append(v) except: pass cart_item = CartItem.objects.create(cart = cart,product = product) if len(product_var) > 0: cart_item.variations.add(*product_var) cart_item.quantity = qty cart_item.save() return HttpResponseRedirect(reverse("cart")) return HttpResponseRedirect(reverse("cart")) template.html <form class="form pull-right" method='POST' action="{% url 'buy_now' product.slug %}"> {% csrf_token %} {% if product.variation_set.all %} {% if product.variation_set.models %} <select class = "form-control" name='model'> {% for item in product.variation_set.models %} <option value ="{{ item.title }}">{{ item.title }}</option> {% endfor %} </select> {% endif %} {% if product.variation_set.sizes %} <select class = "form-control" name='size'> {% for item in product.variation_set.sizes %} <option value ="{{ item.title }}">{{ item.title }}</option> {% endfor … -
DRF: How to limit fields in nested serializer based on field-permissions?
I'm trying to limit the fields list in serializers based on user permissions. I have a generic routine that does it for all serializers. It's working on the parent serializer, but not on a nested serializer. I have a client model, and a client profile (referred to as "contacts") as shown below. The client profile model is an extension of the user model (one-to-one relationship). class Client(AddressPhoneModelMixin, DateFieldsModelMixin, models.Model): name = models.CharField(max_length=100) status = models.CharField(max_length=25) class Meta: permissions = ( # Object-level ('view_all_clients', 'Can view all clients'), ('change_all_clients', 'Can change all clients'), # Field-level ('view_client_id', 'Can view client ID'), ('view_client_name', 'Can view client name'), ...others omitted... ) class ClientProfile(models.Model): user = models.OneToOneField( User, on_delete=models.CASCADE, blank=True, null=True, ) client = models.ForeignKey( Client, on_delete=models.PROTECT, related_name='contacts', ) receive_invoices = models.BooleanField(default=False) My object-level permission logic is in the list view: class ClientList(ListAPIView): permission_classes = (IsAuthenticated,) serializer_class = ClientSerializer def get_queryset(self): user = self.request.user queryset = None if user.has_perm('view_client') or user.has_perm('clients.view_all_clients'): queryset = Client.objects.all().exclude(status__in=['deleted', 'archived']) if user.has_perm('view_client'): # View only "assigned" clients if user.type == 'client': # See if user is a "contact". queryset = queryset.distinct().filter(contacts__user=self.request.user) else: # See if user is assigned to projects for the client(s). queryset = queryset.distinct().filter(projects__project_users__user=self.request.user) if queryset is None: …