2017-02-19 1 views
0

Я использую Django + Angular 2 . Я создаю пользователя штраф, но он не имеет значения по умолчанию, я хочу ...Инициализировать пользователя django, чтобы он имел значения по умолчанию

Модель

class Settings(models.Model): 
    user = models.ForeignKey('auth.User', related_name='settings', on_delete=models.CASCADE) 
    bolean1 = models.BooleanField(default=False) 
    boolean2 = models.BooleanField(default=False) 
    boolean3 = models.BooleanField(default=False) 
    string1 = models.CharField(max_length=100, default='No description') 

Serializer

class SettingsSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Settings 
     fields = ('id', 'bolean1', 'bolean1', 'bolean3', 'string1') 

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('id', 'username', 'email', 'password' ,'settings', 'image') 
     extra_kwargs = {'password': {'write_only': True}} 

class CreateUserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('email', 'username', 'password') 
     extra_kwargs = {'password': {'write_only': True}} 

    def create(self, validated_data): 
     user = User(
      email=validated_data['email'], 
      username=validated_data['username'] 
     ) 
     user.set_password(validated_data['password']) 
     user.save() 
     return user 

Просмотров

class SettingsValues(generics.ListAPIView): 
    serializer_class = SettingsSerializer 
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,) 

    def get_queryset(self): 
     queryset = Settings.objects.all() 
     queryset = queryset.filter(user=self.request.user.id) 
     return queryset 


class RegisterUser(generics.ListCreateAPIView): 
    queryset = User.objects.all() 
    serializer_class = CreateUserSerializer 

Проблема в том, что когда я создаю нового пользователя, у него нет значений по умолчанию, например, boolean 1, boolean 2 и т. Д. Я должен перейти к django admin, чтобы создать новую настройку и выбрать пользователя.

Любая идея?

ответ

1

Похоже, вы хотите Django's Signals, в частности post_save. Вам нужно создать Settings() для каждого созданного User() - у вас есть значения по умолчанию прямо сейчас, но это помогает только тогда, когда вы сохранили модель Settings.

from django.db.models.signals import post_save 
from django.dispatch import receiver 
from django.contrib.auth import get_user_model 

User = get_user_model() 


@receiver(post_save, sender=User) 
def create_settings(sender, instance, created, **kwargs): 
    # Only create a Settings relation if the User is new 
    if created: 
     settings = Settings(user=instance) 
     settings.save() 

Если ваша модель настройки в приложении под названием settings, то ваши настройки/apps.py должны иметь это - good StackOverflow answer on this:

from django.apps import AppConfig 

class SettingsConfig(AppConfig): 
    name = 'settings' 

    def ready(self): 
     from . import signals 

Теперь, когда новый User создан, Settings отношение также создается для них.

+0

где можно добавить этот код? Я имею в виду models.py? –

+0

Вы можете добавить его в любом месте, но большинство людей хранит его в отдельном файле signal.py. В вашем случае это может быть в том же модуле, где находится ваш models.py. Вы также должны добавить импорт в свой AppConfig, который я добавлю к моему ответу сейчас –

+0

я создал файл сигналов.py и написал код внутри apps.py, но у меня есть ошибка import .signals ^ SyntaxError: недействительный синтаксис –

0

Я не уверен, что это то, чего вы хотите достичь, но попробуйте это.

//admin.py 
from django.contrib import admin 
from django.contrib.auth.models import User 
from django.contrib.auth.admin import UserAdmin 

from accounts import models 


admin.site.unregister(User) 


class UserRoleInline(admin.StackedInline): 
    model = models.UserRole 

class UserRoleAdmin(UserAdmin): 
    inlines = [UserRoleInline] 

admin.site.register(User, UserRoleAdmin) 


//model.py 
from django.db import models 
from django.contrib.auth.models import User 


class RoleType(object): 
    MANAGER = 'm' 
    CANDIDATE = 'c' 
    CHOICES = ((MANAGER, 'Manager'), (CANDIDATE, 'Candidate')) 


class UserRole(models.Model): 
    user = models.OneToOneField(User) 
    role = models.CharField(max_length=1, choices=RoleType.CHOICES) 

preview Ссылка: django StackedInline

Это поможет вам сложить модели настройки в конце модели пользователя. Это не будет автоматически принимать значение по умолчанию, но позволит вам выбрать настройки по мере создания моделей пользователей.

Смежные вопросы