2016-11-28 2 views
3

forms.pyКак получить объекты, созданные уполномоченным пользователем (Джанго)

class KomForm(forms.ModelForm): 
    class Meta: 
     model = Kom 
     fields = ('company', 'title',) 

models.py

class Company(models.Model): 
    author = models.ForeignKey('auth.User') 
    title = models.CharField(max_length=200) 
    created_date = models.DateTimeField(default=timezone.now) 
    published_date = models.DateTimeField(blank=True, null=True) 

    def publish(self): 
     self.published_date = timezone.now() 
     self.save() 

    def __str__(self): 
     return self.title 


class Kom(models.Model): 
    author = models.ForeignKey('auth.User') 
    title = models.CharField(max_length=200) 
    company = models.ForeignKey(Company, on_delete=models.CASCADE) 

    def publish(self): 
     self.published_date = timezone.now() 
     self.save() 

    def __str__(self): 
     return self.title 

views.py

def kommpred_new(request): 
    if request.method == "POST": 
     user = request.user if request.user.is_authenticated() else None 
     form = KommpredForm(request.POST) 
     if form.is_valid(): 
      kp = form.save(commit=False) 
      kp.author = request.user 
      kp.company=forms.ModelChoiceField(queryset=Company.objects.filter(author_id = self.user.id)) 
      kp.published_date = timezone.now() 
      kp.save() 
      return redirect('kommpred_detail', pk=kp.pk) 
    else: 
     form = KommpredForm() 
    return render (request, 'by/kommpred_new.html', {'form': form}) 

Я пытаюсь для реализации выбора пользователя при создании нового объекта через поле формы ModelChoiceField только те, которыми он является. Пока, метод проб и ошибок, я не могу этого сделать. Мне посоветовали это:

class KomForm (forms.ModelForm): 
    class Meta: 
        model = Kom 
        fields = ('company', 'title',) 

    def __init __ (self, * args, ** kwargs): 
        # Call the constructor form and maintain user 
        super (KomForm, self) .__ init __ (* args, ** kwargs) 
        if 'user' in kwargs and kwargs [ 'user'] is not None: 
            user = kwargs.pop ('user') 
            qs = Company.objects.filter (author__id = user.id) 
            self.fields [ 'company']. queryset = qs 

def your_view (request): 
    user = request.user if request.user.is_authenticated() else None 
    form = KomForm (user = user) 
    return render ('template.html' { 'form': form}) 

Но все-таки я не выхожу ...

, как передача в поле ModelChoiceField только те объекты, автором которых является объектом создания пользователя компании?

+0

Ваш вопрос немного запутанный, возможно ли еще немного уточнить, что именно вы пытаетесь сделать? – Hybrid

+0

Пользователь сначала создает, например, две компании. Компаний в базе данных бесчисленное множество. Затем пользователь создает объект Kom, связанный с объектом Компании. В форме создания объекта я хотел бы показать пользователю выбор компаний, созданных только этим пользователем. –

ответ

1

Я не уверен, что я прекрасно понимаю, однако, похоже, что вы ищете аргумент пользователя в форме, но не передаете его из представления.

Сначала я изменил бы в представлении

form = KommpredForm(request.POST) 

в

form = KommpredForm(request.POST, user=user) 

и внутри формы, поставить супер после палить пользователя от kwargs. KomForm не будет ожидать ключевое слово пользователя, поэтому вытащите его перед вызовом super.

def __init __ (self, * args, ** kwargs): 
    # Call the constructor form and maintain user 

    if 'user' in kwargs and kwargs [ 'user'] is not None: 
     user = kwargs.pop ('user') 
     qs = Company.objects.filter (author__id = user.id) 
    else: 
     qs = .... what you want when no user was passed in ... 

    super (KomForm, self) .__ init __ (* args, ** kwargs) 
    self.fields [ 'company']. queryset = qs 

Дайте ему попробовать и опубликуйте результат.

+0

«UnboundLocalError в/по/кп/новый/ локальная переменная 'QS' обращаться до присвоения запроса метода: GET \t Request URL: \t http://127.0.0.1:8000/by/kp/new/ Джанго Версия : \t 1.10.3 Тип исключения: \t UnboundLocalError Exception Значение: \t локальная переменная 'QS' обращаться до присвоения Exception Откуда: \t C: \ Users \ АРС \ Proba \ на \ forms.py в __init__, линия 42' –

+0

Попробуйте self.user = и self.qs = – AMG

+0

см. Http://stackoverflow.com/a/14094400/4872140 для быстрой заметки о том, когда использовать self. – AMG

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