Как сделать текущего пользователя внешним ключом в Django Model - PullRequest
0 голосов
/ 04 января 2019

Я использую администратора Django в качестве панели мониторинга для клиентов (ограниченные разрешения). Я разрешаю им добавлять новые продукты через сайт администратора и хочу использовать текущего пользователя в качестве внешнего ключа в модели «Продукты». Я использую «исключить» в ProductAdmin, чтобы у клиента не было выбора изменить его. Когда «исключить» не используется, пользователь выбирается по умолчанию, и он работает. Когда я включаю «исключить», форма возвращает ошибку, говоря, что поле пустое. Как сделать текущего пользователя внешним ключом в модели «Продукты», независимо от того, добавляют ли они элементы через форму администратора или загружают через csv?

Вот моя модель продукта:

#models.py
from django.db import models
from datetime import datetime
from django.contrib.auth.models import User

class Product(models.Model):
    client_id = models.ForeignKey(User, on_delete=models.DO_NOTHING)
    title = models.CharField(max_length=200)
    asin = models.CharField(max_length=200, blank=True)
    sku = models.CharField(max_length=200, blank=True)
    date_added = models.DateTimeField(default=datetime.now, blank=True)
    in_report = models.BooleanField(default=True)

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(client_id=request.user)

    def __str__(self):
        return self.title

#admin.py
from django.contrib import admin
from .models import Product

class ProductAdmin(admin.ModelAdmin):
    list_display = ('title', 'asin', 'sku', 'in_report')
    list_display_links = ('title', 'asin', 'sku')
    list_editable = ('in_report',)
    search_fields = ('title', 'asin', 'sku', 'in_report')
    list_per_page = 50
    exclude = ('client_id',)

admin.site.register(Product, ProductAdmin)

1 Ответ

0 голосов
/ 05 января 2019

Я считаю, что вы хотите скрыть client_id от пользователей, но при сохранении / изменении объекта через администратора вы хотели бы, чтобы текущий пользователь был сохранен.

Теперь, когда вы exclude client_id от администратора, поле не будет присутствовать в форме, которая затем выдаст ошибку, так как client_id является обязательным полем. Поэтому вы можете переопределить метод save_model админ как:

def save_model(self, request, obj, form, change):
    # associating the current logged in user to the client_id
    obj.client_id = request.user
    super().save_model(request, obj, form, change)

Таким образом, при изменении / добавлении объекта текущему пользователю присваивается client_id. Надеюсь, это поможет

...