Widziałem inną odpowiedź here i inne miejsca w sieci, które zalecają używanie user.get_profile podczas rozszerzania wbudowanego użytkownika django. Nie zrobiłem tego w poniższym przykładzie. Wydaje się, że funkcjonalność działa dobrze, ale czy jest jakiś minus, jeśli nie używasz user.get_profile()?Kiedy należy używać user.get_profile w django?
modelu
class UserProfile(models.Model):
user = models.ForeignKey(User, primary_key=True)
quote = models.CharField('Favorite quote', max_length = 200, null=True, blank=True)
website = models.URLField('Personal website/blog', null=True, blank=True)
class UserProfileForm(ModelForm):
class Meta:
model = UserProfile
fields = ('quote', 'website')
widok
@login_required
def user_profile(request):
user = User.objects.get(pk=request.user.id)
if request.method == 'POST':
upform = UserProfileForm(request.POST)
if upform.is_valid():
up = upform.save(commit=False)
up.user = request.user
up.save()
return HttpResponseRedirect('/accounts/profile')
else:
upform = UserProfileForm()
return render_to_response('reserve/templates/edit_profile.html', locals(), context_instance=RequestContext(request))
Można upuścić wiersz 'user = User.objects.get (pk = request.user.id) w widoku. 'request.user' jest już instancją modelu użytkownika. Ponadto, 'locals()' jest podejrzanie nazwane; nie jest zdefiniowany w widoku, więc czy jest naprawdę lokalny? – JCotton
@JCotton Używanie ['locals()'] (http://docs.python.org/library/functions.html#locals) jest wbudowaną funkcją. Tutaj jest używany jako hack, aby uniknąć konieczności ręcznego definiowania słownika kontekstowego szablonu. To oszczędność czasu, ale prawdopodobnie lepiej jest określić kontekst. Dobry punkt na temat 'request.user'. – Alasdair
@Alasdair hej, dzięki! nie wiesz, że o 'locals()' – JCotton