2016-03-21 15 views
0

ModelFormを使用すると、私は窮地に陥りました。ModelFormと関連するオブジェクトの問題

私はDjangoに付属するextending the User modelです。また、ユーザーが編集できるようにModelFormも使用しています。

ドキュメントの同じ例に従って、私はこのコードを持っています。

models.py

class Employee(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    # In this case, department is optional, so I have set 'blank' and 'null' to True. 
    department = models.CharField(max_length=100, blank=True, null=True) 

forms.py

class DepartmentForm(ModelForm): 
    class Meta: 
     model = Employee 
     fields = ['department',] 

問題が一目できます。私はモデルのインスタンスをフォームに渡す必要があるので、save()関数はカスタマイズする必要はなく、user.employeeはまだ作成されていないので、エラーが発生します。

views.pyは

私は手動でシェルを介してuser.employee.departmentする値を追加してからページをリロードした場合、それが動作
def DepartmentView(request): 
    # Here is the issue. 
    department = request.user.employee 
    if request.method == 'POST': 
     # I need to pass the instance here. 
     form = DepartmentForm(request.POST, instance=department) 
     if form.is_valid(): 
      form.save() 
    else: 
     # And also here so it autocompletes the form. 
     form = DepartmentForm(instance=department) 
    return render(request, 'employee.html', {'form': form}) 

、それ以外の場合はエラーは以下の通りです。

RelatedObjectDoesNotExist at [something] 
User has no employee. 

またはそのような何か...ごめんなさい、私はエラーが少し違うかもしれないが、概念はまったく同じである上記のコードをしようとしませんでした。

これまでにお聞きしたことがありましたら申し訳ありません。私はGoogleの検索を行い、この問題の答えを見つけることができませんでした。

+0

通常、 'CharField'に' null = True'を設定する必要はありません。単純に 'blank = True'を指定した場合、フィールドはオプションで、値が与えられていない場合は空の文字列' '' 'を保存します。 – Alasdair

答えて

0

get_or_createを使用してdbから従業員をフェッチするか、存在しない場合は作成することができます。

department, created = Employee.objects.get_or_create(user=request_or_user, department='') 
if request.method == 'POST': 
    form = DepartmentForm(request.POST, instance=department) 
    ... 

別のオプションは、ユーザーが作成されたときに、関連するモデルが作成されるように、信号を使用することです。従業員はすでに存在しているとみなし、get_or_createの代わりにrequest.user.employeeを使用できます。

+0

ありがとう、 'get_or_create'は私の最善の策だと思われます。モデルに 'null = True'を含めたのは、' get_or_create'を使用していても、フィールドが空のときにそれがなければ多くの 'IntegrityError'エラーが発生するからです。 –

+0

フィールドに 'unique = True'を設定していない限り、完全性エラーが発生しているのに驚いています。インスタンスを作成するときに、 'department = '''を設定することができます。 – Alasdair

+0

'null = True'と' get_or_create'を使うとうまくいきます。 –

関連する問題