Чтобы сделать это с помощью общего представления, такого как CreateView ...
class AddPhotoToProject(CreateView):
"""
a view where a user can associate a photo with a project
"""
model = Connection
form_class = CreateConnectionForm
def get_context_data(self, **kwargs):
context = super(AddPhotoToProject, self).get_context_data(**kwargs)
context['photo'] = self.kwargs['pk']
context['form'].fields['project'].queryset = Project.objects.for_user(self.request.user)
return context
def form_valid(self, form):
pobj = Photo.objects.get(pk=self.kwargs['pk'])
obj = form.save(commit=False)
obj.photo = pobj
obj.save()
return_json = {'success': True}
if self.request.is_ajax():
final_response = json.dumps(return_json)
return HttpResponse(final_response)
else:
messages.success(self.request, 'photo was added to project!')
return HttpResponseRedirect(reverse('MyPhotos'))
, самая важная часть этого ...
context['form'].fields['project'].queryset = Project.objects.for_user(self.request.user)
Я бы порекомендовал отличную серию Изучение скалаза Юджина Йокоты на Скалазе 7. Автор следует структуре Учим тебя, Хаскель за великое благо . Подход системный и очень педагогический.
Некоторые из видео, которые я нашел полезными:
Большинство из у них есть отличные слайды, если вы хардкор, то читайте их без видео.
Также изучают - , читают подписи типа Haskell и просматривают tykelassopedia типа Haskell .
Хотя я никогда никого не отворачивал от учебных пособий по Haskell, они могут быть немного ошеломляющими, если вы разработчик в стиле ООП и не знаете, почему вы хотите жить в функциональном мире. .
Я выступил с докладом «скаляр для всех нас», который подходит к скалазу, хотя примеры, с которыми все знакомы: памятка (Памятка в скалазе), проверка домена (валидация в скалазе) и т. Д. Таким образом, «вариант использования» «Ясно и могу начать учиться решать знакомые проблемы, используя силу скалаза.
Моим советом было бы не ждать, пока вы не почувствуете, что у вас есть общее представление о библиотеке - просто выберите несколько инструментов для начала, а затем переходите по концептуальным ссылкам по ходу работы.
Validation
(который, кстати, на самом деле не является монадой ), вероятно, является единственным лучшим местом для начала. Если вы когда-либо использовали Either
для проверки в стандартной библиотеке, Validation
будет казаться вам знакомым и гораздо более удобным. Вы найдете много полезных обсуждений Validation
и здесь в StackOverflow и в других местах .
Когда вы освоитесь с Validation
, у вас должно быть хорошее общее представление о классе типов аппликативных функторов, который полезен во многих других контекстах.
Monoid
является еще одной хорошей отправной точкой. Это очень простой класс типов (по сути, просто операция, подобная ассоциативному сложению, и элемент идентификации), и как только вы его поймете, вы увидите моноиды повсюду. См., Например, этот ответ (полное раскрытие: он от меня), показывающий, как использовать моноиды для решения проблемы, которая на первый взгляд может показаться не очень моноидальной.
В Scalaz есть множество других полезных маленьких инструментов, которые вы можете использовать, не разбирая всю картину в целом. Bifunctor
- один из моих любимых - он делает работу с кортежами намного удобнее, давая вам возможность отобразить функцию по обеим сторонам:
scala> import scalaz._, Scalaz._
import scalaz._
import Scalaz._
scala> def inc(i: Int) = i + 1
inc: (i: Int)Int
scala> def repeat(n: Int)(s: String) = s * n
repeat: (n: Int)(s: String)String
scala> (inc(_)) <-: (1, "a") :-> repeat(3)
res0: (Int, String) = (2,aaa)
Как только вы хорошо разберетесь в нескольких эти концепции я бы предложил в Typeclassopedia Брента Йорджи, который ориентирован на Хаскель, но выполняет фантастическую работу, предоставляя вам достаточно теории категорий и абстрактной алгебры, чтобы понять большинство вещей, которые вы найдете в Scalaz.