我是 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/