Как переопределить поле формы в представлении на основе функций в Django?
Мне нравится использовать форму в представлении, основанном на функциях, но я хочу переопределить поле выбора kategoria
, чтобы показывать только объекты, связанные с пользователем.
models.py
class Blog_poszt(models.Model):
def __str__(self):
return str(self.user)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="blog_szerzo")
datetime = models.DateTimeField(auto_now_add=True, auto_now=False)
cim = models.CharField(max_length=300)
cim_slug = models.CharField(max_length=300, null=True, blank=True)
szoveg = models.CharField(max_length=10000, null=True, blank=True)
kategoria = models.ForeignKey('Blog_kategoriak', on_delete=models.CASCADE, null=True, blank=True)
kep = models.FileField(upload_to="blog/", null=True, blank=True)
class Blog_kategoriak(models.Model):
def __str__(self):
return str(self.user)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="kategoria_szerzo")
datetime = models.DateTimeField(auto_now_add=True, auto_now=False)
kategoria = models.CharField(max_length=200)
forms.py
class UjBlogposztForm(forms.ModelForm):
class Meta:
model = Blog_poszt
fields = '__all__'
exclude = ('user',)
views.py
def blog_poszt(request):
form = UjBlogposztForm(request.POST, request.FILES)
if request.method == 'POST':
if form.is_valid:
form.instance.user = request.user
form.save()
context = {
'form': form,
}
html
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn btn-dark">Mentés</button>
</form>
Вы можете:
def blog_poszt(request):
...
form = UjBlogposztForm()
form.fields["kategoria"].queryset = Blog_kategoriak.objects.filter(user=request.user)
context = {"form": form}
....
Вы можете сделать это с помощью метода __init__
формы.
Попробуйте сделать это следующим образом:
forms.py
from django import forms
class UjBlogposztForm(forms.ModelForm):
class Meta:
model = Blog_poszt
fields = '__all__'
exclude = ('user',)
def __init__(self, *args, **kwargs):
user = kwargs.pop('user', None)
super(UjBlogposztForm, self).__init__(*args, **kwargs)
if user:
self.fields['kategoria'].queryset = Blog_kategoriak.objects.filter(user=user)
views.py
from django.shortcuts import render
def blog_poszt(request):
if request.method == 'POST':
form = UjBlogposztForm(request.POST, request.FILES, user=request.user)
if form.is_valid():
form.instance.user = request.user
form.save()
# Redirect to a success page or handle as needed
else:
form = UjBlogposztForm(user=request.user)
context = {
'form': form,
}
return render(request, 'your_template.html', context)
Метод __init__
в UjBlogposztForm
модифицирован для принятия аргумента user, который используется для фильтрации набора запросов поля Your Model kategoria
, чтобы показывать только категории, относящиеся к данному пользователю. В файле представления текущий пользователь (request.user)
передается форме при инстанцировании, что гарантирует, что поле kategoria
будет заполнено вариантами, относящимися только к текущему пользователю.