2012-01-29 3 views
0

Это был совершенно другой вопрос, но я его редактирую и добавляю совершенно новый, потому что я решил его.Django: присвоение экземпляра модели пользователю

Во всяком случае, у меня есть models.py:

from django.db import models 
from django.contrib.auth.models import * 
from django.utils.translation import gettext as _ 

class PLanguages(models.Model): 
    plangs = models.CharField('Language', max_length=50) 
    def __unicode__(self): 
     return self.plangs 

class Frameworks(models.Model): 
    frameworks = models.CharField('Frameworks', max_length=50) 
    def __unicode__(self): 
     return self.frameworks 

class Projects(models.Model): 
    name = models.CharField('projectname', max_length=50) 
    technologies = models.ManyToManyField(PLanguages) 
    frameworks = models.ManyToManyField(Frameworks) 
    image = models.ImageField('project_image', upload_to="img/users/projects") 
    url = models.URLField('url', blank=True) 

class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    fullname = models.CharField('Full Name', max_length=50) 
    birthdate = models.DateTimeField('Birthday') 
    url = models.URLField('Website', blank=True) 
    company = models.CharField('Company', max_length=50) 
    CATEGORY_CHOICES = (
      ('M',_('Male')), 
      ('F',_('Female')), 
      ) 
    gender = models.CharField('Gender', max_length=200, choices = CATEGORY_CHOICES) 
    picture = models.ImageField('Picture/Avatar', upload_to='img/users/profile', blank=True) 
    bio = models.TextField() 
    projects = models.ManyToManyField(Projects) 
    #planguages = models.ManyToManyField(PLanguages) 
    #frameworks = models.ManyToManyField(Frameworks) 

, в utils.py:

def get_profile_model(): 
    """ 
    Return the model class for the currently-active user profile 
    model, as defined by the ``AUTH_PROFILE_MODULE`` setting. If that 
    setting is missing, raise 
    ``django.contrib.auth.models.SiteProfileNotAvailable``. 

    """ 
    if (not hasattr(settings, 'AUTH_PROFILE_MODULE')) or \ 
      (not settings.AUTH_PROFILE_MODULE): 
     raise SiteProfileNotAvailable 
    profile_mod = get_model(*settings.AUTH_PROFILE_MODULE.split('.')) 
    if profile_mod is None: 
     raise SiteProfileNotAvailable 
    return profile_mod 


def get_profile_form(): 
    """ 
    Return a form class (a subclass of the default ``ModelForm``) 
    suitable for creating/editing instances of the site-specific user 
    profile model, as defined by the ``AUTH_PROFILE_MODULE`` 
    setting. If that setting is missing, raise 
    ``django.contrib.auth.models.SiteProfileNotAvailable``. 

    """ 
    profile_mod = get_profile_model() 
    class _ProfileForm(forms.ModelForm): 
     #planguages = forms.ModelMultipleChoiceField(queryset=PLanguages.objects.all(), required=False, widget=forms.CheckboxSelectMultiple) 
     #frameworks = forms.ModelMultipleChoiceField(queryset=Frameworks.objects.all(), required=False, widget=forms.CheckboxSelectMultiple) 
     class Meta: 
      model = profile_mod 
      exclude = ('user',) # User will be filled in by the view. 
    return _ProfileForm 

def get_project_form(): 
    """ 
    Return a form class (a subclass of the default ``ModelForm``) 
    suitable for creating/editing instances of the site-specific user 
    profile model, as defined by the ``AUTH_PROFILE_MODULE`` 
    setting. If that setting is missing, raise 
    ``django.contrib.auth.models.SiteProfileNotAvailable``. 

    """ 
    profile_mod = get_profile_model() 
    class _ProjectForm(forms.ModelForm): 
     planguages = forms.ModelMultipleChoiceField(queryset=PLanguages.objects.all(), required=False, widget=forms.CheckboxSelectMultiple) 
     frameworks = forms.ModelMultipleChoiceField(queryset=Frameworks.objects.all(), required=False, widget=forms.CheckboxSelectMultiple) 
     class Meta: 
      model = Projects 
      exclude = ('user',) # User will be filled in by the view. 
    return _ProjectForm 

, и далее в views.py:

def create_project(request, form_class=None, success_url=None, 
        template_name='profiles/create_profile.html', 
        extra_context=None): 

    # 
    # We set up success_url here, rather than as the default value for 
    # the argument. Trying to do it as the argument's default would 
    # mean evaluating the call to reverse() at the time this module is 
    # first imported, which introduces a circular dependency: to 
    # perform the reverse lookup we need access to profiles/urls.py, 
    # but profiles/urls.py in turn imports this module. 
    # 

    if success_url is None: 
     success_url = reverse('profiles_profile_detail', 
           kwargs={ 'username': request.user.username }) 
    if form_class is None: 
     form_class = utils.get_project_form() 
    if request.method == 'POST': 
     form = form_class(data=request.POST, files=request.FILES) 
     if form.is_valid(): 
      profile_obj = form.save(commit=False) 
      profile_obj.user = request.user 
      profile_obj.save() 
      if hasattr(form, 'save_m2m'): 
       form.save_m2m() 
      return HttpResponseRedirect(success_url) 
    else: 
     form = form_class() 

    if extra_context is None: 
     extra_context = {} 
    context = RequestContext(request) 
    for key, value in extra_context.items(): 
     context[key] = callable(value) and value() or value 

    return render_to_response(template_name, 
           { 'form': form }, 
           context_instance=context) 
create_project = login_required(create_project) 

. Теперь я могу создать проект, но проблема в том, что этот проект не назначен пользователю, который его создал, но это просто проект, который не назначен никому. Любые подсказки о том, как назначить его пользователю, который его создает, будут высоко оценены.

+0

«Это был совершенно другой вопрос, но я редактирую его и добавляю совершенно новый, потому что я решил его». - Пожалуйста, не делайте этого, откройте новый вопрос. – cha0site

+0

Извините. Больше не повторю. – Milos

ответ

1

Исправлено добавлением user = models.ForeignKey(User, unique=False) в категорию Projects. Уникальный - False, потому что у пользователей может быть несколько проектов.

Кредиты идут на ловкость от #django на freenode.

0

Если вы ждете название проекта, который будет напечатан, то вам нужно добавить

def __unicode__(self): 
    return self.name 

так, что отображается название проекта. В противном случае он просто отображает представление объекта Project, которое вы видите.

+0

Хорошо, похоже, вы отредактировали, чтобы изменить шаблон от {{profile}} до {{profile.name}}. Мой ответ выше был для вашего первоначального вопроса. – rajasaur

+0

Извините, я отредактировал свой вопрос, так как вы в последний раз его читали. – Milos

+1

вы можете открыть оболочку (оболочка python manage.py) и запустить файл profile.projects.all, чтобы узнать, сколько записей возвращается. Без тестового теста трудно понять, где проблема, так как ваш код кажется правильным отображать оба проекта. – rajasaur

Смежные вопросы