its a simple problem forgive me if i didn’t understand how to solve it but really don’t know how or forget how
i have a Post model
class Post(models.Model):
id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, primary_key=True)
title = models.CharField(max_length=200, db_index=True, blank=False, default='')
snippet = models.OneToOneField(Snippet, on_delete=models.CASCADE, related_name='post_snippets', blank=True, null=True)
creator = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="post_creator")
...
and Snippet model
class Snippet(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
title = models.CharField(max_length=100, blank=True, default='')
code = models.TextField()
and simple form
class PostUpdateForm(forms.ModelForm):
tag = forms.ModelChoiceField(queryset=Tag.objects.all(), widget=forms.Select())
genre = forms.ModelChoiceField(queryset=Genre.objects.all(), widget=forms.Select())
class Meta:
model = Post
exclude = ('views', 'creator', 'maintainer', 'snippet')
and the view is simplest
@login_required
def edit_post(request, pk):
post = get_object_or_404(Post, pk=pk)
if request.method == 'POST':
form = PostUpdateForm(request.POST, request.FILES, instance=post)
if form.is_valid():
form.save()
messages.success(request, _('Your profile has been successfully updated!'))
return redirect('blog:details', post.pk)
else:
messages.error(request, _('Please correct the following error.'))
else:
form = PostUpdateForm(instance=post)
context = {'post': form}
return render(request, 'blog/post_form.html', context)
if a post has been created without a snippet i can go to edit page to see all post fields
but if the post has been created with a snippet, when i go to edit page i can’t see all the snippet fields
sure i didn’t exclude the snippet field from the model to have all field but i will see only the related snippet field as a choices
but i want all the snippet fields to be shown in the post form to be edited if the post has already snippet fields
i have tried this form
class PostUpdateForm(forms.ModelForm):
#add_code = forms.BooleanField(widget=forms.CheckboxInput(attrs={'class': 'checkbox', 'id': 'post-snippet'}), required=False)# attr. for JS addEvent or css styling
tag = forms.ModelChoiceField(queryset=Tag.objects.all(), widget=forms.Select())
genre = forms.ModelChoiceField(queryset=Genre.objects.all(), widget=forms.Select())
class Meta:
model = Post
#fields = '__all__'
#fields = ['title', 'tag', 'maintainer', 'post_img', 'content', 'snippet', 'genre', 'post_language', 'video', 'post_type', 'urls', 'views', 'status' ]
exclude = ('creator', 'views')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields('snippet_title', 'code', 'linenos', 'language', 'style', 'highlighted').queryset = Snippet.objects.all()
# override clean(self): method if you have any logical operations for any fields see (an invalid form control file)
def clean(self):
cleaned_data = super().clean()
# if this Item already exists
if self.instance.add_code:
# add the old quantity to the new quantity
cleaned_data['snippet_title', 'code', 'linenos', 'language', 'style', 'highlighted'] = self.instance.snippet
return cleaned_data
def save(self, commit=True):
post, created = Post.objects.update_or_create(snippet=self.snippet, creator=self.creator)
#rest of your logic
return post
but it gives me
TypeError at /blog/posts/884483e4-0102-4ca1-b7b4-66a9d8282f62/update/
'dict' object is not callable
how to get all snippet fields inside the form and not like choices
please some help bother @KenWhitesell