47👍
I solved this by overriding form_valid
method. Here is verbose style to clarify things:
class CreateArticle(CreateView):
model = Article
def form_valid(self, form):
article = form.save(commit=False)
article.author = self.request.user
#article.save() # This is redundant, see comments.
return super(CreateArticle, self).form_valid(form)
Yet we can make it short (thanks dowjones123), this case is mentioned in docs.:
class CreateArticle(CreateView):
model = Article
def form_valid(self, form):
form.instance.author = self.request.user
return super(CreateArticle, self).form_valid(form)
15👍
I just stumbled into this problem and this thread led me in the right direction (thank you!). Based on this Django documentation page, we can avoid calling the form’s save()
method at all:
class CreateArticle(LoginRequiredMixin, CreateView):
model = Article
def form_valid(self, form):
form.instance.author = self.request.user
return super(CreateArticle, self).form_valid(form)
- [Django]-Django: How can I protect against concurrent modification of database entries
- [Django]-Django bulk_create with ignore rows that cause IntegrityError?
- [Django]-How to check whether the user is anonymous or not in Django?
2👍
You should set up a CreateView
using a ModelForm
for that model. In the form definition, you set the ForeignKey
to have the HiddenInput
widget, and then use the get_form
method on the view to set the value of your user:
forms.py:
from django import forms
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
widgets = {"user": forms.HiddenInput()}
views.py:
from django.views.generic import *
from myapp.forms import ArticleForm
from myapp.models import Article
class NewArticleView(CreateView):
model = Article
form_class = ArticleForm
def get_form(self, form_class):
initials = {
"user": self.request.user
}
form = form_class(initial=initials)
return form
- [Django]-How to See if a String Contains Another String in Django Template
- [Django]-Add Text on Image using PIL
- [Django]-Set up a scheduled job?
2👍
Berislav’s code in views.py doesn’t work for me. The form is rendered as expected, with the user value in a hidden input, but the form is not saved (I don’t know why). I have tried a slightly different approach, that works for me:
views.py
from django.views.generic import *
from myapp.forms import ArticleForm
from myapp.models import Article
class NewArticleView(CreateView):
model = Article
form_class = ArticleForm
def get_initial(self):
return {
"user": self.request.user
}
- [Django]-Constructing Django filter queries dynamically with args and kwargs
- [Django]-Cannot import name _uuid_generate_random in heroku django
- [Django]-Django Unit Testing taking a very long time to create test database
1👍
There are answers that are mainly related to the User
model foreign key. However, let’s suppose a simple scenario in which there is a model Comment
containing a foreign key of the Article
model, and you need to have a CreateView
for Comment
where each comment will have a foreign key of the Article
model. In that case, the Article
id would probably be in the URL
, for example, /article/<article-id>/comment/create/
. Here is how you can deal with such a scenario
class CommentCreateView(CreateView):
model = Comment
# template_name, etc
def dispatch(self, request, *args, **kwargs):
self.article = get_object_or_404(Article, pk=self.kwargs['article_id'])
return super(CommentCreateView, self).dispatch(request, *args, **kwargs)
def form_valid(self, form):
form.instance.article= self.article # if the article is not a required field, otherwise you can use the commit=False way
return super(CommentCreateView, self).form_valid(form)
- [Django]-How to assign items inside a Model object with Django?
- [Django]-How to get getting base_url in django template
- [Django]-Django Rest Framework model serializer with out unique together validation