Как использовать имя пользователя в качестве строки в модели в Django? - PullRequest
0 голосов
/ 18 октября 2019

Я хочу использовать имя пользователя учетной записи, в которой запущен мой django, в качестве строки для загрузки полей модели, специфичных для этого имени пользователя. Я создал файл survey.py, который возвращает словарь, и мне нужны ключи в качестве полей. Как я могу получить имя пользователя в виде строки?

from django.db import models
from django.contrib.auth.models import User
from multiselectfield import MultiSelectField
from survey_a0_duplicate import details, analysis                                                                           
import ast

class HomeForm1(models.Model):
    user= models.OneToOneField(User, on_delete=models.CASCADE,)



    details.loadData(survey_name = user)#<=====This loads the data for specific user<======

    global f1
    f1=analysis.getQuestion(in_json=False)#<====We get the dictionary here<========                      

    d=list(f1.keys())


    ###################assign the filters####################################################### 
    for k in d:
        q=list(f1[k].keys())
        q.sort()
        choices=tuple(map(lambda f: (f,f),q))
        locals()[k]=MultiSelectField(max_length=1000,choices=choices,blank=True)


    def save(self, *args, **kwargs):
        if self.pk is None:
            self.user= self.user.username
        super(HomeForm1,self).save(*args,**kwargs)



    def __str__(self):
        return self.title

1 Ответ

0 голосов
/ 18 октября 2019

Это не то, как вы пишете код Django. В любом случае глобальные переменные - плохая идея, но вы не должны использовать их в многопользовательской многопроцессорной среде, такой как Django. У вас сразу же возникнут проблемы с безопасностью потоков;вы не должны этого делать.

Мало того, что в показанном вами коде есть явный глобал, он явно присутствует внутри survey_a0_duplicate - поскольку details.loadData() на самом деле ничего не возвращает, но вы потом "получаетесловарь "из analysis.getQuestion. Вы должны удалить глобальные переменные из обоих мест.

Кроме того, ваш метод сохранения совершенно неверен. У вас есть пользовательские отношения;почему вы перезаписали бы его именем пользователя? Это не только бессмысленно, но и конкретно уничтожает тип поля, которое вы установили. Просто не делай этого. Удалите весь метод сохранения.

Но вам нужно перестать возиться с выбором на уровне класса. Это никогда не сработает. Если вам нужно динамически установить варианты, сделайте это в форме, где вы можете настроить метод __init__ так, чтобы он принимал текущего пользователя и строил варианты на основе этого.

...