python - django ModelChoiceField从views.py设置查询集

标签 python django django-forms django-views

我是 Django 新手,需要一些帮助。

表单.py

import floppyforms as ff
from django import forms
from django.contrib.auth.models import User

from .models import Prodavnica, Racun, Transakcija
...


class IzdatakForm(forms.ModelForm):
    izdatak = forms.DecimalField(max_digits=20,
                              decimal_places=2,
                              widget=forms.NumberInput(attrs={'min': '0', 'step': '0.01'}))
    datum = ff.DateField(widget=ff.DateInput(format='yyyy-mm-dd'))
    vreme = ff.TimeField(widget=ff.TimeInput(attrs={'step': '60'}, format='HH-MM'))
    prodavnica = forms.ModelChoiceField(required=True,queryset=Prodavnica.objects.all())

    class Meta:
        model = Transakcija
        fields = ['izdatak', 'datum', 'vreme', 'racun', 'prodavnica']

模型.py

from django.contrib.auth.models import User
from django.db import models

from django.urls import reverse


# Create your models here.


class Prodavnica(models.Model):
    author = models.ForeignKey(User, on_delete=models.PROTECT)
    naziv = models.CharField(max_length=50, unique=True, blank=False)
    adresa = models.CharField(max_length=200, blank=True)
    telefon = models.CharField(max_length=50, blank=True)
    foursquare = models.URLField(blank=True)

    def get_absolute_url(self):
        return reverse(viewname='finance_detail_shop', kwargs={'pk': self.pk})

    def __str__(self):
        return self.naziv


class Transakcija(models.Model):
    korisnik = models.ForeignKey(User, on_delete=models.PROTECT)
    suma = models.DecimalField(max_digits=20, decimal_places=2, default='0.0')
    izdatak = models.DecimalField(max_digits=20, decimal_places=2, default='0.0', null=True)
    dodatak = models.DecimalField(max_digits=20, decimal_places=2, default='0.0', null=True)
    prodavnica = models.ForeignKey('Prodavnica', related_name='prodavnica', blank=True, null=True)
    racun = models.ForeignKey('Racun', related_name='Racun')
    datum = models.DateField()
    vreme = models.TimeField()

    def get_absolute_url(self):
        return reverse(viewname='finance_detail_transaction', kwargs={'pk': self.pk})



    def __str__(self):
        return '%s %s (%s %s)' % (self.pk, self.suma, self.datum,self.vreme)



class Racun(models.Model):
    vlasnik = models.ForeignKey(User, on_delete=models.PROTECT, related_name='vlasnik')
    ovlacena_lica = models.ManyToManyField(User, related_name='ovlaceno_lice')
    naziv = models.CharField(max_length=50, unique=True)
    broj = models.IntegerField(unique=True)

    def get_absolute_url(self):
        return reverse(viewname='finance_detail_account', kwargs={'pk': self.pk})

    def __str__(self):
        return self.naziv

View .py

class TransakcijaDodatakCreate(CreateView):
    model = Transakcija
    form_class = DodatakForm


    def get_form(self, form_class=None):
        user = self.request.user
        racun = Racun.objects.filter(Q(vlasnik=user) | Q(ovlacena_lica=user))
        self.fields['racun'].queryset = racun
        return super().get_form(form_class)

    def form_valid(self, form):
        user = self.request.user
        form.instance.korisnik = user
        form.instance.izdatak = None
        form.instance.prodavnica = None
        return super(TransakcijaDodatakCreate, self).form_valid(form)

    template_name = 'finance/transakcija/dodaci/form.html'

返回错误“NoneType”对象不可订阅。

我试图仅将 ModelChoiceField racun 的查询集设置为用户拥有的那些 racun。

我想知道是否可以从 CreateView 为 ModelChoiceField 设置查询集?

最佳答案

该代码属于表单上的 __init__ 方法,而不是 View 中。

class DodatakForm(forms.ModelForm):
    ...

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super(DodatakForm, self).__init__(*args, **kwargs)
        if user:
            racun = Racun.objects.filter(Q(vlasnik=user) | Q(ovlacena_lica=user))
            self.fields['racun'].queryset = racun

并在 View 中,定义 get_form_kwargs,而不是覆盖 get_form:

def get_form_kwargs(self, *args, **kwargs):
    kwargs = super(TransakcijaDodatakCreate, self).get_form_kwargs(*args, **kwargs)
    kwargs['user'] = self.request.user
    return kwargs

关于python - django ModelChoiceField从views.py设置查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44912843/

相关文章:

python - Django 有自动排序模型字段的方法吗?

python - 将一个字符与其在段落中的下一个字符交换

python - 插入拼接列表时出现奇怪的行为?

python - 如何将 per-env Tox deps 与 Pip 需求文件结合起来?

python - Django 1.6.5 和 Celery 3.1 用于定期任务

python - 使用 PK 而不是用户名的选择字段的 ModelForm

Python:为什么右移>>向下舍入,应该在哪里使用?

python - 如何在keras中为共享层建模?

python - AttributeError at/'tuple' 对象没有属性 '_meta'

python - Django - modelform不保存图像