Reputation: 33
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})
I'm trying to implement a user-choice when creating a new object through a form field ModelChoiceField only those of which he is. So far, the method of trial and error, I can not do it. I was advised this:
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})
But still I do not go out ...
how transfer in the field ModelChoiceField only those objects, the author of which is the object of creating a company user?
Upvotes: 3
Views: 753
Reputation: 1646
I'm not sure I understand perfectly, however, it looks like you are looking for the user argument in the form, but not passing it from the view.
First I'd change in the view
form = KommpredForm(request.POST)
to
form = KommpredForm(request.POST, user=user)
and inside the form, put the super after you pop off the user from the kwargs. KomForm won't be expecting the user keyword, so pop it off before calling 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
Give that a try and post back with result.
Upvotes: 1