2012-01-29 38 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 2012-01-29 09:24:08

+0

對不起。不會再做。 – Milos 2012-01-29 09:27:26

回答

1

通過在Projects類中添加user = models.ForeignKey(User, unique=False)來固定。唯一的是False,因爲用戶可以有多個項目。

積分從freenode上的#django轉到snuggl。

0

如果你期望要打印的項目的名稱,那麼你需要添加

def __unicode__(self): 
    return self.name 

,從而顯示該項目的名稱。否則它只顯示Project對象的repr,這就是你所看到的。

+0

好的,看起來您已將模板從{{profile}}更改爲{{profile.name}}。我上面的回答是針對你原來的問題。 – rajasaur 2012-01-29 07:28:32

+0

對不起,自上次閱讀以來,我編輯了我的問題。 – Milos 2012-01-29 07:28:47

+1

你可以打開一個shell(python manage.py shell)並運行profile.projects.all來查看返回了多少條記錄。如果沒有測試用例,很難找出問題出在哪裏,因爲您的代碼似乎正確地顯示了這兩個項目。 – rajasaur 2012-01-29 07:31:10

相關問題