私のアプリケーションでは、ユーザーグループを使用してユーザーのタイプを表しています。私の特定のケースでは、ユーザーは1つのグループにしか参加できません。実装では、2つのオプションがあります。
- ManyToManyをForeignKeyになるようにオーバーライドします
- 私のフォームではManyToManyをMultipleChoiceFieldとして表現し、1つの送信のみを受け入れて、そこから移動します。
オプション2を選択したのは、ユーザーを2つのグループに参加させることがテストに役立つ場合があるためです(便宜上)。実装に関しては、この2つに違いはないと思います(ただし、アドバイスをいただければ幸いです)。
私の見解では、2つ(UserのUserProfile拡張クラスのManyToMany)を関連付けるコードを記述します。これが機能しているかどうかはわかりません。
私が遭遇する主なエラーは、フォームが検証を許可せず、ManyToManyが続行するには「値のリスト」が必要であると言っていることです。
私は次のコードセットを持っています:
forms.py
from django.forms import ModelForm, Textarea
from django.contrib.auth.models import User, Group
from registration.models import UserProfile
from django import forms
from django.db import models
class RegistrationForm(ModelForm):
class Meta:
model = User
fields = ('username', 'password', 'email', 'first_name', 'last_name', 'groups')
widgets = {
'groups': forms.Select,
'password': forms.PasswordInput,
# 'text': Textarea(attrs = {'rows': 3, 'class': 'span10', 'placeholder': 'Post Content'}),
}
def __init__(self, *args, **kwargs):
super(RegistrationForm, self).__init__(*args, **kwargs)
self.fields['groups'].label = 'Which category do you fall under?'
views.py
def get_registration(request):
if request.method == 'POST':
register_form = RegistrationForm(request.POST)
company_form = CompanyRegistrationForm(request.POST, request.FILES)
if register_form.is_valid() and company_form.is_valid(): # check CSRF
if (request.POST['terms'] == True):
new_user = register_form.save()
new_company = company_form.save()
new_profile = UserProfile(user = user, agreed_terms = True)
new_profile.companies_assoc.add(new_company)
new_profile.save()
return HttpResponseRedirect(reverse('companyengine.views.get_company'))
return render(request, 'registration/register.html', { 'register_form': register_form, 'company_form': company_form } )
else:
first_form = RegistrationForm
second_form = CompanyRegistrationForm
return render(request, 'registration/register.html', { 'register_form': register_form, 'company_form': company_form } )
およびtemplates.html
<h2>Sign Up</h2>
<form action="/register" method="POST" enctype="multipart/form-data">{% csrf_token %}
<p>{{ register_form.non_field_error }}</p>
{% for field in register_form %}
<div class="control-group">
{{ field.errors }}
<label class="control-label">{{ field.label }}</label>
<div class="controls">
{{ field }}
</div>
</div>
{% endfor %}
<div id="company_fields">
<p>{{ register_form.non_field_error }}</p>
{% for field in company_form %}
<div class="control-group">
{{ field.errors }}
<label class="control-label">{{ field.label }}</label>
<div class="controls">
{{ field }}
</div>
</div>
{% endfor %}
</div>
<label><input type="checkbox" name="terms" id="terms"> I agree with the <a href="#">Terms and Conditions</a>.</label>
<input type="submit" value="Sign up" class="btn btn-primary center">
<div class="clearfix"></div>
</form>
すべてが完全に正常にロードされているようです。ただし、Groupsフィールドには「値のリスト」が必要なため、フォームはis_valid()を通過しません。TextField / TextAreaからの情報を解析する方法を他の人が尋ねるのを見たことがありますが、情報が1つしかないため、なぜ情報を分割する必要があるのかわかりません。
あなたのアドバイスは大歓迎です。