Присвоение значений новому пользователю из представления

#python #django #django-models #django-admin #django-views

#python #django #django-модели #django-администратор #django-представления

Вопрос:

У меня есть файл приложения с моделями.py вот так:

 from django.db import models
from django.contrib.auth.models import User
from fileman.fields import AutoForeignKey

from django.utils.translation import ugettext as _

class Setting(models.Model):
    owner = AutoForeignKey(User, unique=True, related_name='fileman_Setting')
    root = models.CharField(max_length=250, null=True)
    home = models.CharField(max_length=250, null=True)
    buffer = models.TextField(blank=True)
    class Meta:
        permissions = (
            ("can_fm_list", _("Can look files list")),
            ("can_fm_add", _("Can upload files")),
            ("can_fm_rename", _("Can rename files")),
            ("can_fm_del", _("Can move files to basket")),
            ("can_fm_destruct", _("Can delete files")),
        )
    def __unicode__(self):
        return unicode(self.owner)
    def __init__(self, *args, **kwargs):
        super(Setting, self).__init__(*args, **kwargs)
        if not self.root:
            self.root = None
            self.home = None
    def writeBuffer(self, data):
        self.buffer = data
        self.save()
  

Я хочу назначить root, home и разрешения для пользователя при его регистрации: это то, что у меня есть в userprofile/views.py

 from fileman.models import Setting

def register(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password1')
            newuser = User.objects.create_user(username=username, email='', password=password)

            if form.cleaned_data.get('email'):
                newuser.email = form.cleaned_data.get('email')
                EmailValidation.objects.add(user=newuser, email=newuser.email)
            newuser.save()
            # Fileman Settings
            newuser.fileman_Setting.owner = newuser
            newuser.fileman_Setting.root = '/home/aton2/ajunkkil/Django/basedraft/uploads'
            print(newuser.fileman_Setting.root)
            newuser.fileman_Setting.home = '/home/aton2/ajunkkil/Django/basedraft/uploads/useruploads'
            print(newuser.fileman_Setting.home)
            newuser.save()

            return HttpResponseRedirect('%scomplete/' % request.path_info)
    else:
        form = RegistrationForm()

    template = "userprofile/account/registration.html"
    data = { 'form': form, }
    return render_to_response(template, data, context_instance=RequestContext(request))
  

Приложение имеет функцию в admin, которая позволяет устанавливать корневые и домашние папки для пользователей там. Но я хочу, чтобы это происходило автоматически при регистрации пользователя. Я получаю владельца просто отлично, но home и root остаются как ‘None’, даже если print(newuser.fileman_Setting.root) это правильно. Чего мне не хватает?

fileman/admin.py

 from django.contrib import admin
from fileman.models import *

class SettingAdmin(admin.ModelAdmin):
   list_display = ('owner', 'root', 'home')

admin.site.register(Setting, SettingAdmin)
  

Комментарии:

1. Правильно отформатируйте исходный код — он нечитаем.

Ответ №1:

Вам также нужно сохранить newuser.fileman_Setting , потому что django не будет сохранять изменения в моделях автоматически.

Комментарии:

1. Спасибо, newuser.fileman_Setting.save() сработал. Как мне добавить разрешения для новых пользователей, используя тот же параметр класса?

2. через администратора или как описано здесь docs.djangoproject.com/en/1.3/topics/auth/#methods

Ответ №2:

Я понятия не имею, что AutoForeignKey делает, но предполагая, что это похоже на стандартный ForeignKey, обратное fileman_Setting относится к набору запросов.

Внешний ключ — это отношение «один ко многим», где «один» — это сторона, определяющая FK, а обратное отношение, доступ к которому осуществляется через имя, присвоенное в related_name , — это множество, поэтому представлено набором запросов. Таким образом, вместо того, чтобы устанавливать поля home и root для отдельных настроек, вы определяете произвольные атрибуты в наборе запросов, которые затем игнорируются.

Похоже, вам, вероятно, в любом случае нужно здесь OneToOneField. Как только вы это сделаете, то, как говорит Дмитрий, вам нужно будет не забыть сохранить это.

Комментарии:

1. Как мне назначить пользователю разрешения из класса Settings Meta?